MySQL优化(2):索引失效与强制索引使用
在项目中需要做个报表统计,需要做多表联查,同一个 SQL 语句 Where 字段相同,但条件值不同,索引使用情况仅然不同,还存在索引失效的情况,使用强制索引与是否一起使用分页对查询效率的影响还存在关联影响。
于是做了如下分析。
数据表
一个数据表,表结构如下,表中的数据每天新增大概 3000 多条。
1 | CREATE TABLE `record_1.1` ( |
- 表中已有数据 296871 条,
-
status
,默认值为undiagnose
,还有状态unfinished
和finished
两个状态 - 建了
status
字段的普通索引 status
为undiagnose
的有 288083 条,占比超 97%,unfinished
有 8429 条,finished
有 359 条
统计需求
需求:统计出所有部门每天的每种状态的数据量
如下 SQL,统计所有部门每天的状态为 undiagnose
的数据量, 其它两种状态只需改下 status
的值。
1 | SELECT |
索引失效
查询所有部门每天的状态为
undiagnose
的数据量,对该条 SQL 使用 EXPLAIN 获取执行计划详情,发现有用到索引,但执行的却全表扫描。而状态为unfinished
和finished
则执行了索引。分析:undiagnose 的数据量占比超 97%,优化器认为全表扫描比使用索引效率更优,就会放弃使用索引。
在执行查询时,默认未使用索引,undiagnose 的查询毫时 1.39 秒左右;
增加强制索引(
force index(idx_name)
)测试,毫时反而到 1.58秒左右。加上分页条件 Limit 0,20,未使用索引毫时,undiagnose 的查询毫时 1.39秒左右,而增加强制索引的查询,毫时又降低到 1.2 秒左右。
MySQL优化(2):索引失效与强制索引使用
http://blog.gxitsky.com/2021/07/02/MySQL-Optimization-02-force-index/