mysql datetime-Feld mit Index erhalten einen Bereich "wie" vs. "zwischen und" Leistung

9

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?

    
bluearrow 14.06.2013, 05:06
quelle

2 Antworten

13

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.

%Vor%

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.

%Vor%

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.

%Vor%

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' .

    
RandomSeed 14.06.2013, 06:44
quelle
1

Eine Alternative für solche Fälle ist etwa Folgendes:

%Vor%

Am Ende bekommt man alle Ereignisse von diesem Tag.

    
RenatoSz 14.02.2014 22:10
quelle

Tags und Links