sql >> Base de Datos >  >> RDS >> Mysql

Cláusula IN que no usa índice

Me arriesgaré y diré que es porque estás usando el motor MyISAM.

Funciona perfectamente bien con INNODB como se puede ver en esta Respuesta mía.

Intentaré asustar a al menos 1 referencia honorable sobre el asunto.

Aquí, El tipo de combinación de rango , claramente un enfoque INNODB ya que es el motor predeterminado. Y cuando no se menciona explícitamente en el manual en alguna jerarquía de documentación, se asume.

Tenga en cuenta que no hay nada contiguo sobre las identificaciones en mi enlace de ejemplo. Es decir, no te concentres demasiado en type=range en su salida EXPLAIN. La velocidad se obtiene a través del Optimizer (el CBO).

La cardinality en mi ejemplo es muy alto (4,3 Millones). Los recuentos de identificación de destino son relativamente bajos (1000). Se utiliza el índice.

Su situación puede ser la opuesta:su cardinalidad puede ser increíblemente baja, como 3, y el optimizador decide abandonar el uso del índice.

Para verificar su índice cardinality , consulte la página del manual Sintaxis SHOW INDEX .

Una simple llamada como:

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      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+