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

MySQL arrête d'utiliser l'index lorsque des contraintes supplémentaires sont ajoutées

C'est un peu difficile à expliquer.

La requête qui utilise l'index l'utilise car l'index est un index "de couverture". Autrement dit, toutes les colonnes de l'index sont dans la requête. La seule partie de l'index réellement utilisée efficacement est la condition sur la latitude .

Normalement, un index de couverture aurait seulement les colonnes mentionnées dans la requête. Cependant, la clé primaire est utilisée pour référencer les enregistrements, donc je suppose que users.Id est la clé primaire sur la table. Et l'index est en cours d'analyse pour les valeurs valides de latitude .

La requête qui n'utilise pas l'index ne l'utilise pas pour deux raisons. Premièrement, les conditions sur les colonnes sont des inégalités. Une recherche d'index ne peut utiliser que des conditions d'égalité et une inégalité. Cela signifie que l'index ne peut être utilisé que pour latitude dans sa méthode la plus efficace. Deuxièmement, les colonnes supplémentaires de la requête nécessitent de toute façon d'accéder à la page de données.

En d'autres termes, l'optimiseur dit en fait :"Pourquoi s'embêter à aller à l'index pour parcourir l'index, puis scanner les pages de données ? Au lieu de cela, je peux simplement scanner les pages de données et obtenir tout en même temps."

Votre prochaine question est sans aucun doute :"Mais comment puis-je accélérer ma requête ?" Ma suggestion serait d'étudier les index spatiaux .