事件背景

生产环境发现有查询超时,通过异常日志获取查询sql并进行排查,explain后发现该sql使用了filesort,导致查询效率问题

Case 1

查询sql & 索引情况

  • 查询sql
    select * from table where column1 = 'xxx' and column2 in ('a','b','c') order by id asc limit 100
  • 现有索引
    主键索引
    联合索引column1,column3

优化过程

经过explain发现,上述sql使用到了column1,column3的联合索引,但是查询中并不包含column3列,猜测可能是由于这个优化引擎使用了该索引才导致的filesort

于是删除column1,column3的联合索引,新建column1,column2,column3的单独索引,再次执行explain发现已经不存在filesort

Case 2

查询sql & 索引情况

  • 查询sql
    select * from table where user_id = 'xxx' and type in ('a','b','c') order by time desc limit 100
  • 现有索引
    主键索引
    单独索引user_id
    单独索引type
    单独索引time
    联合索引user_id,type,time

优化过程

经过explain发现,上述sql使用到了user_id,type,time的联合索引,但是Extra的结果为filesort,猜测可能是由于column2数据较少,索引命中率过低导致

于是删除了联合索引user_id,type,time,新建联合索引user_id,time,再次explain发现已经不存在filesort

后续尝试调整联合索引顺序,发现无论是user_id,type,time 或 user_id,time,type ,上述查询都会使用这个联合索引,但是都存在filesort,目前没有排查出优化引擎为何会出现filesort,如果有大佬知道也欢迎留言指教


老污的猫
30 声望5 粉丝