mysql-datetime-Feld mit dem index Holen Sie sich eine Reihe von 'wie' und 'zwischen' Leistung
Habe ich nur finden kann mysql query datetime verwenden wie:
like '2013-06-12%'
Denke ich, kann es nicht den index verwenden. Ich Google es, aber nicht finden können, Thema direkt. Also ich habe einen test mit einer Tabelle mit 3308614 records. Die erste SQL:
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
Alle wir wissen, das SQL nicht verwenden können, die index und es dauert 4 Sekunden, um das Ergebnis zu erhalten.
Die zweite SQL:
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Ich weiß nicht, ob er kann den index verwenden, aber es dauert 4 Sekunden zu.
Die Dritte SQL:
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
Alles, was wir wissen, die Dritte-SQL können Sie den index benutzen, und es dauert 0.016 Sekunde.
So, ich denke, 'wie' kann nicht den index verwenden, wenn die Abfrage der datetime-Feld, weil mysql konvertiert datetime-Feld in string zuerst und senden Sie den string an, wie Befehl.
Ist das richtig ?
- "Ist das richtig ?" --- yep
- Sie können die Abfrage von Datum und wie diese
t.active_time = '2013-06-30'
- kann NICHT t verwenden.active_time = '2013-06-30' !!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter der Annahme, dass
t.active_time
's Art istDATETIME
,Folgende Abfrage kann einen index verwenden, da der Aufruf der Funktion. Alle
active_time
konvertiert werden müssen on-the-fly zu einemDATE
Wert vor dem Vergleich mit'2013-06-30'
. Dieser string ist in einerDATE
Wert in den ersten Platz, und dies geschieht nur einmal, ganz am Anfang der Abfrage.Die zweite Abfrage nicht verwenden können, einen index entweder aus ähnlichen Gründen. Sind Sie eigentlich so ein string-Vergleich (weil der
LIKE
Betreiber). Alleactive_time
Werte werden in einen string konvertiert on-the-fly.Nur die Letzte kann man einen index verwenden. Die Saiten
'2007-11-30'
und'2007-12-01'
geworfen werden, umDATETIME
in diesem Fall, weil die<
und>
Betreiber dies zulassen.Letzteres gilt auch für die
=
undBETWEEN
Betreiber.Informationen, alle Arten verglichen werden können, um eine Zeichenfolge mit der
LIKE
Betreiber, leiden unter dem gleichen problem wie oben beschrieben, wegen der impliziten Konvertierung, die es benötigt.t.active_time = '2013-06-30'
funktioniert nicht wie erwartet, weil'2013-06-30'
ist gegossen, um eineDATETIME
Wert, das heißt'2013-06-30 00:00:00'
.Eine alternative für solche Fälle ist, so etwas zu tun:
Am Ende erhalten Sie alle Ereignisse von diesem Tag.