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

Pourquoi mysql atteint l'index lorsque la colonne est renvoyée à la ligne avec la fonction de date

Le rapport EXPLAIN est connu pour être difficile à interpréter. Ils ont surchargé trop d'informations dans quelques champs. Vous pourriez essayer

Le type: index indique qu'il effectue un balayage d'index , ce qui signifie qu'il visite chaque entrée de l'index.

Cela visite le même nombre d'entrées qu'un balayage de table, sauf qu'il s'agit d'un index secondaire au lieu de l'index clusterisé (primaire).

Quand on voit type: index , EXPLAIN affiche possible_keys: NULL ce qui signifie qu'il ne peut utiliser aucun index pour effectuer une recherche efficace. Mais il affiche également la key: add_time ce qui signifie que l'index qu'il utilise pour l'index-scan est add_time .

L'index-scan est dû au fait que MySQL ne peut pas optimiser les expressions ou les appels de fonction par lui-même. Par exemple, si vous essayez de rechercher des dates avec un mois spécifique, vous pouvez rechercher month(add_time) = 4 mais cela n'utiliserait pas l'index sur add_time car les dates avec ce mois sont dispersées dans l'index, pas toutes regroupées.

Vous savez peut-être que date(add_time) devrait pouvoir être recherché par l'index, mais MySQL ne fait pas cette inférence. MySQL voit simplement que vous utilisez une fonction et n'essaie même pas d'utiliser l'index.

C'est pourquoi MySQL 5.7 a introduit les les colonnes générées pour nous permettre d'indexer une expression, et MySQL 8.0 l'a rendu encore meilleur en autorisant un index à définir pour une expression sans nous obliger à définir d'abord une colonne générée.