MySQL Referenz: http://dev.mysql.com/doc/refman/5.6/en/explain-output.html
Index- und Tabellenzugriffe
MySQL-Ausführungspläne können besonders leicht missverstanden werden und ein falsches Gefühl von Sicherheit geben. In den Ausführungsplänen bedeutet der Begriff „Index“ oft nur, dass der Index irgendwie benutzt wird – nicht dass er effizient benutzt wird. Die wichtigste Information eines MySQL-Ausführungsplanes steckt in der type
-Spalte. Aber auch dort bedeutet index
nicht unbedingt etwas Gutes.
- eq_ref, const
Durchwandert den Index-Baum um eine Zeile zu finden (wie
INDEX UNIQUE SCAN
) und lädt weitere Spalten aus der Tabelle falls nötig (wieTABLE ACCESS BY INDEX ROWID
). Die Datenbank verwendet diese Operation, wenn ein Constraint sicherstellt, dass maximal ein Eintrag dem Abfragekriterium entspricht. Siehe „Using Index“ um zu prüfen, ob ein Tabellenzugriff stattfindet.- ref, range
Durchwandert den Indexbaum und folgt anschließend den Index-Blättern, um alle Treffer zu finden (wie
INDEX RANGE SCAN
) und lädt weitere Spalten aus der Tabelle falls nötig (wieTABLE ACCESS BY INDEX ROWID
). Siehe „Using Index“ um zu prüfen, ob ein Tabellenzugriff stattfindet.- index
Liest den ganzen Index – alle Zeilen – in der Reihenfolge des Indexes.
- ALL
Auch bekannt als Full-Table-Scan (FTS). Liest die ganze Tabelle – alle Zeilen – wie gespeichert. Das heißt, in „zufälliger“ Reihenfolge. Obwohl die Blöcke nicht einzeln, sondern mehrere auf einmal gelesen werden, gehört
ALL
zu den teuersten Zugriffsmethoden überhaupt. Neben der Last am Speichersystem ist ein Full-Table-Scan auch sehr CPU-intensiv, da alle Tabellenzeilen gegen diewhere
-Klausel geprüft werden müssen. Siehe auch „Full-Table-Scan“.- Using Index (Extra)
Wenn „Using Index“ in der Extra-Spalte aufscheint, heißt das, dass kein Zugriff auf die eigentliche Tabelle stattfindet, weil alle benötigten Spalten sind im Index sind. Eine bessere Bezeichnung wäre daher „Using Index ONLY“. Wenn der Zugriff über einen Clustered Index erfolgt (z. B.
PRIMARY
mit InnoDB), scheint „Using Index“ nicht auf, obwohl es ein Index-Only-Scan stattfindet. Siehe „Index-Only-Scan: Den Tabellenzugriff vermeiden“.- PRIMARY (in key oder possible_keys spalte)
PRIMARY
bezeichnet jenen Index, der implizit mit dem Primärschlüssel angelegt wird. Die Spalten imPRIMARY
-Index entsprechen den Spalten im Primärschlüssel.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
Sortieren und Gruppieren
- using filesort (Extra)
Der Hinweis „using filesort“ in der Extra-Spalte bedeutet, dass eine explizite Sortierung stattfindet – unabhängig davon, was oder wo sortiert wird. Diese Operation benötigt Speicher, um das Ergebnis zwischenzuspeichern (keine Ausführung „am Fließband“). Siehe „
ORDER BY
indizieren“.
Top-N-Abfragen
- implizit: kein „using filesort“ in Extra
MySQL kennzeichnet Top-N-Abfragen nicht explizit im Ausführungsplan. Wenn trotz Verwendung der
LIMIT
-Syntax kein entsprechendesUsing filesort
aufscheint, erfolgt die Ausführung „am Fließband.“ Siehe „Top-N-Zeilen abfragen“.