von Markus Winand.

Operationen in MySQL Ausführungsplänen


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 (wie TABLE 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 (wie TABLE 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 die where-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.

PRIMARY (in key oder possible_keys spalte)

PRIMARY bezeichnet jenen Index, der implizit mit dem Primärschlüssel angelegt wird. Die Spalten im PRIMARY-Index entsprechen den Spalten im Primärschlüssel.

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ührungs­plan. Wenn trotz Verwendung der LIMIT-Syntax kein entsprechendes Using filesort aufscheint, erfolgt die Ausführung „am Fließband.“ Siehe Top-N-Zeilen abfragen.

Über den Autor

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

Kaufen Sie sein Buch bei Amazon

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Bei Amazon kaufen
(Taschenbuch)

Taschenbuch und PDF auch auf Markus' Webseite erhältlich.

Holen Sie sich Markus

…für ein Training ins Büro.

Sein beliebtes Training stimmt Entwickler auf SQL Performance ein.

Erfahren Sie mehr»

„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz | CC-BY-NC-ND 3.0 Lizenz