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

Clause IN n'utilisant pas d'index

Je vais prendre des risques et dire que c'est parce que vous utilisez le moteur MyISAM.

Cela fonctionne parfaitement bien avec INNODB comme on peut le voir dans cette Réponse à moi.

Je vais essayer d'effrayer au moins 1 référence honorable sur le sujet.

Ici, La plage Join Type , clairement un focus INNODB car c'est le moteur par défaut. Et lorsqu'il n'est pas explicitement mentionné dans le manuel dans une hiérarchie de documentation, il est supposé.

Notez qu'il n'y a rien de contigu dans les identifiants de mon exemple de lien. Ce qui signifie, ne vous focalisez pas trop sur type=range dans sa sortie EXPLAIN. La vitesse est obtenue via l'optimiseur (le CBO).

La cardinality dans mon exemple est très élevé (4,3 millions). Le nombre d'identifiants cibles est relativement faible (1 000). L'index est utilisé.

Votre situation peut être l'inverse :votre cardinalité peut être incroyablement faible, comme 3, et l'optimiseur décide d'abandonner l'utilisation de l'index.

Pour vérifier votre index cardinality , voir la page de manuel SHOW INDEX Syntax .

Un simple appel tel que :

show index from ratings;

+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| ratings |          0 | PRIMARY  |            1 | id          | A         |     4313544 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+