关于mysql:故障案例-一次慢SQL优化分析全过程

43次阅读

共计 1839 个字符,预计需要花费 5 分钟才能阅读完成。

欢送来到 GreatSQL 社区分享的 MySQL 技术文章,如有疑难或想学习的内容,能够在下方评论区留言,看到后会进行解答

  • GreatSQL 社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。

客户发给我一个 SQL,让我看看,为什么执行几分钟没有执行完。

我第一眼看到 SQL 的时候,我也感觉很简略,优化过程也比较简单,然而带来的剖析过程与教训还是值得分享的。

SQL 语句如下:

update ap_receive_benefits_log
  set orderstate= i_orderstate where
  requestid = i_orderid;

然而这个 SQL 执行时被重大阻塞了

然而这个 SQL 执行时被重大阻塞了

该 SQL 的执行打算

疑难 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 中显示的变量传参名,而不是表的字段名。

Enjoy GreatSQL :)

文章举荐:

GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6…

万答 #12,MGR 整个集群挂掉后,如何能力主动选主,不必手动干涉
https://mp.weixin.qq.com/s/07…

『2021 数据技术嘉年华·ON LINE』:《MySQL 高可用架构演进及实际》
https://mp.weixin.qq.com/s/u7…

一条 sql 语句慢在哪之抓包剖析
https://mp.weixin.qq.com/s/AY…

万答 #15,都有哪些状况可能导致 MGR 服务无奈启动
https://mp.weixin.qq.com/s/in…

技术分享 | 为什么 MGR 一致性模式不举荐 AFTER
https://mp.weixin.qq.com/s/rN…

对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

Gitee:
https://gitee.com/GreatSQL/Gr…

GitHub:
https://github.com/GreatSQL/G…

Bilibili:
https://space.bilibili.com/13…

微信 &QQ 群:
可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群

QQ 群:533341697
微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0