Erzielen eines seltsamen Verhaltens von MySQL 5.6. Die folgende Abfrage soll einige einfache Daten aus einem Join auswählen. Was gut funktioniert.Doppelte Spalte in Select-Abfrage führt zu schnellerer Abfrageausführung
SELECT
f.followID,
l.object_id,
l.created_at,
ROUND(UNIX_TIMESTAMP(l.created_at)/(3600)) window
FROM fb_follow f LEFT JOIN fb_likes l ON f.followID = l.user_id
WHERE f.profileID = 1
AND l.created_at > '20171119' LIMIT 1000;
Das Merkwürdige passiert, wenn ich versehentlich ein Duplikat der Linie l.created_at
enthalten.
SELECT
f.followID,
l.object_id,
l.created_at,
l.created_at,
ROUND(UNIX_TIMESTAMP(l.created_at)/(3600)) window
FROM fb_follow f LEFT JOIN fb_likes l ON f.followID = l.user_id
WHERE f.profileID = 1
AND l.created_at > '20171119' LIMIT 1000;
Die Abfrageausführungszeit ging von ~ 600 ms bis ~ 350 ms (für verschiedene Werte von f.profileID
wiederholt. Was ist der Grund für niedrigere Abfragezeit sein kann? Meine Erwartung ist, dass sie zumindest weniger Zeit, da weniger Daten übernehmen würden zurück?
War dieser Lauf unmittelbar nach dem ersten? Der Grund ist, wenn die fraglichen Daten noch im Speicher sind, könnte es allein dafür schneller laufen. Oder hast du das in wiederholten (gefahrenen) Läufen zwischen beiden gesehen? – kchason
Ja wiederholt läuft auf beiden Beispielen mit dem gleichen Ergebnis. – capitrane
Cache wie in InnoDB Pufferpool (Speicher) und Festplatten-Cache sind wahrscheinlich zu niedrigeren Ausführungszeit –