请选择 进入手机版 | 继续访问电脑版
点击联系客服
客服QQ:509006671 客服微信:mengfeiseo
查看: 13|回复: 1

失败案例|缓慢的SQL优化分析整个过程

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-6-10 16:40:40 | 显示全部楼层 |阅读模式
客户向我发送了SQL,让我看看为什么几分钟没有完成执行。

第一次看到SQL的时候,我也觉得很简单,优化过程比较简单,但带来的分析过程和经验还是值得分享的。

SQL语句如下:

更新AP  _ receive  _ benefits  _ log

setorderstate=I  _ orderstatewhere

请求id=I  _ orderid

但是,该SQL执行时被严重阻止。





此SQL的执行计划
-width: 100%; display: block;"/>



疑问1
发现执行计划key走的主键,但是细看行数,会发现是全表扫描了数据。
如果没有可用索引的情况下,执行计划为什么显示走的主键,而不是空的呢?



疑问2
这个SQL里的 i_orderid 字段会不会是表中的一个字段呢,如果不是字段,是哪里来的?



分析解决步骤如下
1、确认表中的数据量约75万,这个UPDATE语句每天都需要执行很多次。
2、查看表后,发现并没有 i_orderid 字段,很是奇怪。就想这个SQL怎么来的,让开发确认一下这个SQL的来源,我来确认执行计划。如果是mysql 5.6以上版本可以直接查看UPDATE的执行计划,发现这个语句没有利用任何索引。
3、开发找了半天,确认程序没有这个语句。怎么办,好像成了‘没人认领的死尸’,开发确认不了,只能自己查了。
4、使用 pt-query-digest 分析最近几个小时的慢查询,发现问题如下:



5、有一个存储过程执行次数很多,响应时间也是也是最大,分析此过程,查看该存储过程:



6、此存储过程执行情况:



7、到此,通过查看存储过程,可以确认发生阻塞的语句是过程里调用的,把存储过程发给开发,再次得到确认。
8、知道语句了,优化就简单了,先确认字段的基数(唯一性)。



9、加上索引 alter table ap_receive_benefits_log idx_requestId(requestId); 后,这个UPDATE就可以走索引了,问题解决。


再次回应上面的疑问



疑问1
为什么update执行计划没有索引情况下,使用的主键?
这个因为update语句查看执行计划的时候显示用的是主键,全表更新就是聚集索引,把这个update语句换成select,执行计划就是key显示的空。以下是测试的例子:
update的时候执行计划



转成select语句执行计划






疑问2
为什么show processlist显示的是字段或者是变量名,误导了我的思路?
测试一下:
创建过程并调用,延迟结果



查看processlist的结果



从测试结果看到,过程调用有变量传参的时候,在processlist中显示的变量传参名,而不是表的字段名。
回复

使用道具 举报

1

主题

276

帖子

-60

积分

限制会员

积分
-60
发表于 2021-6-10 16:44:11 | 显示全部楼层
找到好贴不容易,我顶你了,谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|汕头@IT精英团

Powered by Discuz! X3.4 © 2021 Comsenz Inc.

GMT+8, 2021-6-25 14:41 , Processed in 0.813389 second(s), 40 queries .

快速回复 返回顶部 返回列表