Ich finde nur, dass mysql datetime mit like:
abfragen kann %Vor%Ich denke, es kann den Index nicht verwenden. Ich google es, aber kann solches Thema nicht direkt finden. Also habe ich einen Test mit einer Tabelle mit 3308614 Datensätze. Das erste SQL:
%Vor%Alles, was wir wissen, kann dieser SQL den Index nicht verwenden und es dauert 4 Sekunden, um das Ergebnis zu erhalten. Das zweite SQL:
%Vor%Ich weiß nicht, ob es den Index benutzen kann, aber es dauert auch 4 Sekunden. Das dritte SQL:
%Vor%Alles, was wir wissen, kann der dritte SQL den Index verwenden, und es dauert 0,016 Sekunden.
Ich denke also, dass "like" den Index nicht verwenden kann, wenn das datetime-Feld abgefragt wird, weil mysql das datetime-Feld zuerst in einen String und dann in einen ähnlichen Befehl konvertieren soll. Ist das korrekt?
Angenommen,% t.active_time
ist DATETIME
,
Die folgende Abfrage kann wegen des Funktionsaufrufs keinen Index verwenden. Alle active_time
müssen vor dem Vergleich mit DATE
sofort in einen '2013-06-30'
-Wert konvertiert werden. Diese Zeichenfolge wird an erster Stelle in einen DATE
Wert konvertiert, und dies geschieht nur einmal am Anfang der Abfrage.
Die zweite Abfrage kann aus ähnlichen Gründen keinen Index verwenden. Sie machen tatsächlich einen String-Vergleich (wegen des Operators LIKE
). Alle active_time
-Werte werden während der Übertragung in eine Zeichenfolge konvertiert.
Nur der letzte kann einen Index verwenden. Die Zeichenfolgen '2007-11-30'
und '2007-12-01'
werden in diesem Fall in DATETIME
umgewandelt, weil die Operatoren <
und >
dies zulassen.
Letzteres gilt auch für die Operatoren =
und BETWEEN
.
Zur Information können alle Typen mit einer Zeichenkette mit dem Operator LIKE
verglichen werden, die aufgrund der impliziten Konvertierung das gleiche Problem wie oben beschrieben aufweist.
t.active_time = '2013-06-30'
funktioniert nicht wie erwartet, weil '2013-06-30'
in einen DATETIME
-Wert umgewandelt wird, also '2013-06-30 00:00:00'
.