1、背景
慢SQL导致的线上问题,现象是数据库查询性能从几十毫秒跳变到6秒,引发大面积客诉。
2、根因
业务积压导致索引区分度下降,触发MySQL Intersection索引合并优化,优化时merge了另一个区分度极差的索引,导致慢SQL。
3、排查范围
同时满足以下3个条件的系统需要重点检查:
1)分别对不同字段建立了索引,且有些字段区分度不高;
2)查询条件中同时包含多个已建立索引的字段,平时使用区分度高的索引;
3)一些异常场景,可使区分度高的数据积压,造成区分度下降;
4、优化建议
1)删除低区分度的索引(此措施尤其重要,按普世原则,也不应在区分度低的字段建索引);
2)建立多个字段的联合索引;
附1:详细描述及解决过程
1)数据库任务表中,有status、type两个字段,分别建立了单独的索引;
2)日常查询sql为“where status=xxx and type=xxx”,未出现过问题;
3)出现问题时,排查到慢SQL;
4)紧急联系DBA清除已完成任务,减少表中记录数(操作方式:将原表改名,新建一张空表,导入需要保留的数据,此方式速度快),执行此操作后,问题已解决;
5)继续排查问题根因,发现问题发生时,某业务批量导入数据,引起流量突增,任务表中待执行任务增多;
6)DBA协助分析,确定是触发MySQL进行索引合并,因type字段区分度较低(符合条件的记录有700w),导致merge索引的过程极为耗时,引发慢SQL;
7)优化措施:
a、删除type上的索引;
b、建立type+status的联合索引;
附件:
记一次 MySQL Intersection 索引合并_mysql explain type index merge-CSDN博客