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