Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySql refuse d'utiliser l'index

MySQL n'utilisera pas l'index s'il estime qu'il sélectionnerait une partie significativement grande de la table, et il pense qu'un balayage de table est en fait plus efficace dans ces cas.

Par analogie, c'est la raison pour laquelle l'index d'un livre ne contient pas de mots très courants comme "le" -- parce que ce serait une perte de temps de rechercher le mot dans l'index et de trouver la liste des numéros de page. très longue liste, même chaque page du livre. Il serait plus efficace de simplement lire le livre d'un bout à l'autre.

Mon expérience est que cela se produit dans MySQL si les critères de recherche d'une requête correspondent à plus de 20% de la table, et c'est généralement le bon point de croisement. Il peut y avoir des variations en fonction des types de données, de la taille du tableau, etc.

Vous pouvez donner un indice à MySQL pour le convaincre qu'un balayage de table serait d'un coût prohibitif, il serait donc beaucoup plus susceptible d'utiliser l'index. Ce n'est généralement pas nécessaire, mais vous pouvez le faire comme ceci :

SELECT taskid FROM tasktransitions FORCE INDEX (transitiondate_ix)
WHERE transitiondate>'2013-09-31 00:00:00';