Bei SQL Queries sollte die Abfragezeit nicht ewig dauern sonder eigentlich in einer brauchbaren Zeit durchgelaufen sein.
Oft stellt man sich dann die Frage ob NOT IN
, NOT EXISTS
oder doch ein LEFT JOIN
mit IS NULL
abfrage schneller ist und wann man welche Methode einsetzen sollte.
Ich bin mal gespannt ob es große Unterschiede in der Ausführungszeit gibt bei den drei Varianten. Da alle drei Ansätze das selbe machen sollen, sollte es eigentlich keinen großen Unterschied in der Laufzeit liegen.
Die Randbedingungen
- Database Version: MySQL v5.1.73
- Tabelle „import_drag_xmlfiles“
- Indizes Spalten: partNumber, brandName
- Datensätze: ca. 170000
- Tabelle „import_drag_images_data“
- Indizes Spalten: filename
- Datensätze: ca. 18000
Beispiele
Beispiel Abfrage für die NOT IN
Methode
Beispiel Abfrage für die NOT EXISTS
Methode
Beispiel Abfrage für LEFT JOIN mit IS NULL
Um zu prüfen welche Methode nun schneller ist wurden erst mal alle drei mit EXPLAIN ausgeführt und SQL_NO_CACHE. Hier das Ergebnis des Ausführungsplans.
EXPLAIN
EXPLAIN der Methode NOT IN
EXPLAIN der Methode NOT EXISTS
EXPLAIN der Methode LEFT JOIN mit IS NULL
Fazit/Ergebnis
Laut den Ausführungsplan wird ist die Lösung mit den JOIN am schnellsten.
Da wir ja das Ergebnis mit der Marke (Brand) einschränken, benutzt MySQL beim ausführen natürlich den Index mit der Spalte „brandName“. Das bietet sich ja auch an.
Was passiert aber wenn wir die Marke mal weglassen?