MySQL: NOT IN , NOT EXISTS oder LEFT JOIN mit IS NULL Abfrage?

Bei 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: 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 _NO_CACHE. Hier das Ergebnis des Ausführungsplans.

EXPLAIN

EXPLAIN der Methode NOT IN

Methode-1---NOT-IN

EXPLAIN der Methode NOT EXISTS

Methode-1b---NOT-EXISTS

EXPLAIN der Methode LEFT JOIN mit IS NULL

Methode-1c---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 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?

 

Folgende Artikel könnten auch interessieren