在进行范围查询中,查询已经建立好索引的某个字段,会存在索引失效的情况。

假设有一张表 Test(id, A),数据量为1000。在字段 A 上建立普通索引 idx_A

情况一

1
EXPLAIN SELECT * FROM `test` WHERE A > 10;

image.png

利用 EXPLAIN 进行分析,type 为 ALL,说明进行了全表扫描

情况二

1
EXPLAIN SELECT * FROM `test` WHERE A > 10;

image.png

利用 EXPLAIN 进行分析,type 为 range,说明用到了索引

情况三

1
2
EXPLAIN SELECT COUNT(*) FROM `test` WHERE A < 10;
EXPLAIN SELECT COUNT(*) FROM `test` WHERE A > 10;

image.png

image.png

利用 EXPLAIN 进行分析,两条 SQL 的 type 为 range,说明都用到了索引

原因分析

由于用到的是二级索引,需要进行回表查询才能获得索引数据,MySQL 的优化器会对语句进行优化,当查询的数据量大时,会采用全表扫描避免回表带来的开销。当数据量小时会使用索引并进行回表查询。

使用 COUNT(*) 统计数量时,无需回表查询,可以直接利用索引进行查询。