Die Ausgabe von EXPLAIN
zeigt
ALL
in der type
-Spalte,
wenn MySQL die Abfrage unter Verwendung eines Tabellenscans
auflöst. Dies geschieht in der Regel unter den folgenden
Bedingungen:
Die Tabelle ist so klein, dass ein Tabellenscan schneller ist als eine Schlüsselsuche. Dies betrifft in erster Linie Tabellen mit weniger als zehn Datensätzen und geringer Datensatzlänge.
In der ON
- oder
WHERE
-Klausel für indizierte Spalten
sind keine verwendbaren Einschränkungen vorhanden.
Sie vergleichen indizierte Spalten mit Konstantenwerten, und
MySQL hat (basierend auf dem Indexbaum) berechnet, dass die
Konstanten einen zu großen Teil der Tabelle abdecken und
ein Tabellenscan schneller ginge. Siehe auch
Abschnitt 7.2.4, „Optimierungen der WHERE
-Klausel“.
Sie verwenden einen Schlüssel mit niedriger Kardinalität (d. h., viele Datensätze entsprechen dem Schlüsselwert) über eine andere Spalte. In diesem Fall geht MySQL davon aus, dass die Verwendung des Schlüssels viele Suchvorgänge nach sich ziehen würde und ein Tabellenscan schneller ginge.
Bei kleinen Tabellen ist ein Tabellenscan oft die passende Lösung. Die Auswirkungen auf die Leistung sind vernachlässigbar. Bei großen Tabellen sollten Sie die folgenden Methoden ausprobieren, damit der Optimierer sich nicht fälschlicherweise für einen Tabellenscan entscheidet:
Aktualisieren Sie die Schlüsselverteilung in der gescannten
Tabelle mit ANALYZE TABLE
. Siehe auch
Abschnitt 13.5.2.1, „tbl_name
ANALYZE TABLE
“.
Verwenden Sie FORCE INDEX
für die
gescannte Tabelle, um MySQL mitzuteilen, dass Tabellenscans
im Vergleich zur Verwendung des angegebenen Indexes sehr
kostspielig sind:
SELECT * FROM t1, t2 FORCE INDEX (index_for_column
) WHERE t1.col_name
=t2.col_name
;
Siehe auch Abschnitt 13.2.7, „SELECT
“.
Starten Sie mysqld mit der Option
--max-seeks-for-key=1000
, oder weisen Sie
den Optimierer mit SET
max_seeks_for_key=1000
an, vorauszusetzen, dass
kein Schlüsselscan mehr als 1000 Schlüsselsuchvorgänge
auslösen wird. Siehe auch
Abschnitt 5.2.2, „Server-Systemvariablen“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.