暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

一次慢sql优化

原创 柠檬不心酸 2023-01-18
353

tb:

https://teambition.ximalaya.com/project/5b39ebb6f686d8001909c919/bug/section/all/task/63b4f4a49daf360037af4916

定位:

xdcs未能提供任何帮助,除了超时啥也没给到,mainstay升级之后会有超时日志,也是在踢球

没啥价值不必参考!

目前仅发现这一家企业出现问题,其他企业暂无,接口太慢导致慢查询

看运气,运气好9s左右,运气差点10s以上


线上debug:

代码如下:

添加日志,定位代码位置,一共有两处sql查询,第一个是查询条目数,第二个是查询具体信息

查询条目数耗时如下:

25ms,查询的数据库,innodb引擎,这个速度可以了

查询具体信息耗时如下:

9152ms 很慢!!!


直接执行代码的sql一下看看速度


去掉排序之后再来看

根因,大分页导致的问题

修复方案:

业内解决深度分页的方案很多很多,现在的选择是改动最小的一种方案----自连接免回表

采用覆盖索引定位id后使用id查询,避免深度分页+回表同时出现,目前只有深度分页

select * from t_point_account_detail t1 inner join (select id from t_point_account_detail
where corp_id=28552 and task_id = 1 ORDER BY id DESC limit 20) t2 where t1.id=t2.id limit 100;

代码修改部分如下:

解析:

mysql在执行select a,b from xxx的语句的时候,如果a和b刚好是索引字段,此时mysql将不会回表检索数据,反之需要回表检索数据,底层sql执行器会执行两次查询,性能自然低

子表使用覆盖索引后,内部的条件随便写性能都不会很差

主表用的是主键查询,性能自然是可以保障的

对比:

before:

after:

性能提升200倍!!!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论