在进行范围查询中,查询已经建立好索引的某个字段,会存在索引失效的情况。
假设有一张表 Test(id, A)
,数据量为1000。在字段 A 上建立普通索引 idx_A
情况一
1 | EXPLAIN SELECT * FROM `test` WHERE A > 10; |
利用 EXPLAIN
进行分析,type 为 ALL
,说明进行了全表扫描
情况二
1 | EXPLAIN SELECT * FROM `test` WHERE A > 10; |
利用 EXPLAIN
进行分析,type 为 range
,说明用到了索引
情况三
1 | EXPLAIN SELECT COUNT(*) FROM `test` WHERE A < 10; |
利用 EXPLAIN
进行分析,两条 SQL 的 type 为 range
,说明都用到了索引
原因分析
由于用到的是二级索引,需要进行回表查询才能获得索引数据,MySQL 的优化器会对语句进行优化,当查询的数据量大时,会采用全表扫描避免回表带来的开销。当数据量小时会使用索引并进行回表查询。
使用 COUNT(*)
统计数量时,无需回表查询,可以直接利用索引进行查询。