Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cláusula IN não usando índice


Vou arriscar e dizer que é porque você está usando o mecanismo MyISAM.

Está funcionando perfeitamente bem com o INNODB, como pode ser visto nesta Resposta meu.

Vou tentar assustar pelo menos 1 referência honrosa sobre o assunto.

Aqui, O tipo de junção do intervalo , claramente um foco do INNODB, pois é o mecanismo padrão. E quando não mencionado explicitamente no manual em alguma hierarquia de documentação, é assumido.

Observe que não há nada contíguo sobre os ids no meu link de exemplo. Ou seja, não se concentre em type=range em sua saída EXPLAIN. A velocidade é alcançada através do Optimizer (o CBO).

A cardinality no meu exemplo é muito alto (4,3 milhões). As contagens de ID de destino são relativamente baixas (1000). O índice é usado.

Sua situação pode ser oposta:sua cardinalidade pode ser incrivelmente baixa, como 3, e o otimizador decide abandonar o uso do índice.

Para verificar seu índice cardinality , consulte a página do manual SHOW INDEX Syntax .

Uma chamada simples 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      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+