该执行计划是线上一个查询语句(select count(*) from table WHERE note_type = 1 and subject_code = 'register' and is_used = 1 and create_time like '2022-03-10%' )
三个字短分别建立了索引
根据查询计划显示可以知道进行了索引合并,于是分别把三个索引删除,创建了一个联合索引顺序为: (note_type,subject_code,is_used)。索引创建好后 查看执行计划 索引的合并问题解决了,但是扫描的行数反更多了,但是依然走了索引。为什么会这样呢?
经过对数据的分析发现这三个字短的区分度不是很高 所以扫描了大部分数据,但是依然走了索引。
既然已经知道了原因,那也就好解决了,现按照日期进行查询 在按照其他条件查询,把创建的联合索引删除,然后重新创建(create_time,note_type,subject_code,is_used)按照这个顺序创建好,再次执行以上SQL:
select count() from table WHERE create_time like '2022-03-10%' and note_type = 1 and subject_code = 'register' and is_used = 1.
查看执行计划:发现扫描的行数变少了,但是 执行计划的索引类型:是index 说明效率还不是很高,继续优化
那怎么优化呢?
经过分析和测试发现 是 like 模糊查询导致 ,但是依然走了索引 只是这种效率不高。然后把模糊查询 改为范围查询: select count() from table WHERE create_time bteween '2022-03-10' and '2022-03-10 23:59:59' and note_type = 1 and subject_code = 'register' and is_used = 1. 查看执行计划发现 确实生效了 执行计划的 索引类型index->range 这下效率提高了。