Hallo,
(siehe Post 3 - es ist doch kein HAVING problem)
ich importiere täglich ca. 30.000 Datensätze in meine lokale Datenbank, um daraus Statistiken zu erstellen. Da kommt es hin und wieder vor, dass einige Datensätze doppelt importiert werden (aber das ist ein anderes Problem). Nun, ob nun doppelte Datensätze vorhanden sind, überprüfe ich mit folgendem SQL:
EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE points index NULL points_town_id 4 NULL 1177265 Using whereMir ist nun aufgefallen, dass jeder Tag das SQL länger benötigt, um mir eine Antwort zu geben. Derzeit dauert das Script 106 Sekunden (Vor einigen Tagen lief es noch in 60 Sekunden). Lasse ich jedoch das GROUP BY und das HAVING weg, dauert es nur 2 Sekunden.
Wenn ich das SQL folgend abändere,
EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 31772 Using temporary; Using filesort
2 DERIVED points ALL NULL NULL NULL NULL 1177265 Using whereläuft dies in 2 Sekunden durch, mit dem selben Ergebnis.
Ich habe einmal gelernt, dass bei SQL erst WHERE abgearbeitet wird, und dann erst GROUP BY etc.. Optimiert hier SQL in die falsche Richtung? Kann sich das jemand erklären? Eigentlich sollten die beiden SQL Statements doch gleich schnell sein?
Moloc
(siehe Post 3 - es ist doch kein HAVING problem)
ich importiere täglich ca. 30.000 Datensätze in meine lokale Datenbank, um daraus Statistiken zu erstellen. Da kommt es hin und wieder vor, dass einige Datensätze doppelt importiert werden (aber das ist ein anderes Problem). Nun, ob nun doppelte Datensätze vorhanden sind, überprüfe ich mit folgendem SQL:
PHP:
SELECT * FROM `points`
WHERE DATE(points_time) = CURRENT_DATE()
GROUP BY points_town_id
HAVING COUNT(*) > 1
1 SIMPLE points index NULL points_town_id 4 NULL 1177265 Using where
Wenn ich das SQL folgend abändere,
PHP:
SELECT *
FROM (
SELECT * FROM `points`
WHERE DATE(points_time) = CURRENT_DATE()
) as x
GROUP BY points_town_id
HAVING COUNT(*) > 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 31772 Using temporary; Using filesort
2 DERIVED points ALL NULL NULL NULL NULL 1177265 Using where
Ich habe einmal gelernt, dass bei SQL erst WHERE abgearbeitet wird, und dann erst GROUP BY etc.. Optimiert hier SQL in die falsche Richtung? Kann sich das jemand erklären? Eigentlich sollten die beiden SQL Statements doch gleich schnell sein?
Moloc
Zuletzt bearbeitet: