Ich habe mit MySQL-Indizes (5.5.24, WinXP) herumgespielt, aber ich kann den Grund nicht finden, warum der Server keinen Index benutzt, wenn ein LIKE
benutzt wird.
Das Beispiel ist dies:
Ich habe eine Testtabelle erstellt:
%Vor% Dann habe ich einen Index zu startDate
hinzugefügt. (Bitte fragen Sie nicht, warum die Spalte ein Text und keine Datumsangabe ist. Dies ist nur ein einfacher Test):
Danach fügte ich fast 200.000 Zeilen davon hinzu, wobei startDate 3 mögliche Werte hatte. (Ein Drittel der Erscheinungen für jeden einzelnen .. fast 70.000 Mal)
Also, wenn ich einen EXPLAIN Befehl wie folgt ausführen:
%Vor%Die Antwort lautet wie folgt:
%Vor%Also, die Taste wird benutzt, und die Zeilenanzahl ist fast 200.000 / 3, also ist alles in Ordnung.
Das Problem ist, dass wenn ich die Abfrage zu ändern: (nur changing '=' zu 'LIKE'):
%Vor%In diesem Fall lautet die Antwort:
%Vor%Also wird der Index jetzt nicht verwendet (Schlüssel ist Null und Zeilen nahe der vollen Tabelle..wie der Typ = alle suggeriert).
MySQL-Dokumentation sagt, dass LIKE nutzt Indizes.
Also, was sehe ich hier nicht? Wo ist das Problem?
Danke für Ihre Hilfe.
Basierend auf dem Ubik-Kommentar und den Datenänderungen habe ich Folgendes festgestellt: Der Index IS wird in diesen Fällen verwendet:
%Vor%Aber Der Index wird NICHT verwendet, wenn ich diese Abfrage verwende:
%Vor%Aufgrund der Tatsache, dass in der Spalte startDate alle Werte die gleiche Länge (9 Zeichen) haben, wenn ich eine Abfrage mit einem LIKE-Befehl und einer 9-Zeichen-Konstante verwende, PERHAPS MySQL verwendet den Grund wegen eines Leistungsalgorithmus lieber nicht und geht zur Tabelle.
Es ging mir darum zu sehen, ob ich bei meinen ursprünglichen Tests einen Fehler machte, aber jetzt denke ich, dass der Index und die Tests korrekt sind und dass MySQL in manchen Fällen beschließt, den Index nicht zu verwenden ... und ich wird sich darauf beziehen.
Für mich ist das eine abgeschlossene Aufgabe. Wenn jemand etwas zu dem Thread hinzufügen möchte, sind Sie willkommen.
MySql kann den Index ignorieren, wenn der Index Zugriff auf mehr als 30% der Tabellenzeilen hat. Sie könnten FORCE INDEX [index_name] versuchen, in jedem Fall wird index verwendet.
Der Wert von sysvar_max_seeks_for_key beeinflusst auch, ob der Index verwendet wird oder nicht:
Versuchen Sie, diesen Wert auf eine kleinere Zahl zu ändern.
Suche nach ähnlichen Anfragen auf SO.