mysql champ datetime avec index obtenir une gamme 'comme' vs. 'entre et la performance
Je viens de trouver mysql peut requête datetime en utilisant comme:
like '2013-06-12%'
Je pense qu'il ne peut pas utiliser l'index. Je Google, mais ne peut pas trouver un tel sujet directement. Donc, j'ai un test à l'aide d'une table avec 3308614 enregistrements. Le premier SQL:
SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30';
Tout ce que nous savons de ce SQL ne peut pas utiliser l'index et il faut 4 secondes pour obtenir le résultat.
La deuxième SQL:
SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%';
Je ne sais pas si elle peut utiliser l'index, mais il faut 4 secondes de trop.
La troisième SQL:
SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01';
Tout ce que nous savons de la troisième SQL pouvez utiliser l'index, et il faut 0.016 seconde.
Donc je pense que vous "aimez" ne peut pas utiliser l'index lors de la requête du champ date /heure, parce que mysql doit convertir champ datetime à la chaîne et envoyer la chaîne de commande.
Est-ce correct ?
vous pouvez faire une requête de la date et, comme cette
t.active_time = '2013-06-30'
ne pouvez PAS utiliser t.active_time = '2013-06-30' !!
OriginalL'auteur bluearrow | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
En supposant que
t.active_time
's est de typeDATETIME
,La requête suivante ne peut pas utiliser un index à cause de l'appel de la fonction. Tous les
active_time
doivent être convertis à la volée à unDATE
de la valeur avant de la comparaison avec'2013-06-30'
. Cette chaîne est convertie en unDATE
valeur en tout premier lieu, et cela n'arrive qu'une fois au tout début de la requête.La deuxième requête ne peut pas utiliser un index, soit pour des raisons similaires. Vous êtes en fait de faire une comparaison de chaînes de caractères (en raison de la
LIKE
opérateur). Tous lesactive_time
les valeurs sont converties en une chaîne de caractères à la volée.Seul le dernier peut utiliser un index. Les chaînes
'2007-11-30'
et'2007-12-01'
sont exprimés àDATETIME
dans ce cas, parce que la<
et>
des opérateurs.Ce dernier s'applique également à la
=
etBETWEEN
opérateurs.Pour information, tous les types de peut être comparée à une chaîne avec le
LIKE
opérateur, qui souffrent du même problème que décrit ci-dessus, en raison de la conversion implicite qu'il requiert.t.active_time = '2013-06-30'
ne fonctionne pas comme prévu, car'2013-06-30'
est moulé pour unDATETIME
valeur, c'est-à-dire'2013-06-30 00:00:00'
.OriginalL'auteur RandomSeed
Une alternative pour de tels cas est de faire quelque chose comme ceci:
À la fin vous obtenez tous les événements de la journée.
OriginalL'auteur RenatoSz