MySQL因大事务导致的Insert慢实例分析

作者:wangdong 时间:2024-01-22 22:07:54 

【问题】

INSERT语句是最常见的SQL语句之一,最近有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end

MySQL因大事务导致的Insert慢实例分析

【初步分析】

从等待资源来看,大部分时间消耗在了innodb_log_file阶段,怀疑可能是磁盘问题导致,经过排查没有发现服务器本身存在硬件问题

MySQL因大事务导致的Insert慢实例分析

后面开启线程上升时pstack的自动采集,定位MySQL线程等待的位置。

【分析过程】

部署了pstack的自动抓取后,出现过6次thread concurrency >=50的告警(每次告警时会有大量的慢查询产生),有3次抓到了现场。

并发线程升高时,有50多个线程卡在Stage_manager::enroll_for函数,处于group commit阶段

MySQL因大事务导致的Insert慢实例分析

MySQL因大事务导致的Insert慢实例分析

线程0x519c5940对应的SQL语句如下,已经执行18秒

MySQL因大事务导致的Insert慢实例分析

Stage_manager::enroll_for函数的作用实现了多个线程在flush_stage阶段的排队。简单来说,对于一个分组的事务,是被leader线程去提交的,其他线程处于排队等待状态,等待leader线程将该线程的事务提交完成。

如果第一个线程执行慢,后面的线程都处于等待状态,整组事务无法提交。

MySQL因大事务导致的Insert慢实例分析

流程也可以理解如下,

Session A COMMIT-->拿到锁-->进行binlog写-->commit完成

Session B COMMIT-->等待锁--------------------------->拿到锁-->进行binlog写-->commit完成

第一个线程为什么执行很慢,分析了发生告警时间段的日志文件,发现日志中存在2个15M和20M的大事务

MySQL因大事务导致的Insert慢实例分析

查看日志明细,存在delete from的大事务删除语句,约包含23W条记录,ROW模式下删除23W条记录,会产生大约20M的日志文件,刷盘时间较长,阻塞了同一个分组下其他事务的提交。

MySQL因大事务导致的Insert慢实例分析

事务的开始时间与告警时间吻合

积压的分组下事务集中刷盘,反应到磁盘指标上可以看到在问题时间段的disk_write_kbytes指标出现明显的上升

MySQL因大事务导致的Insert慢实例分析

【优化方案】

1、 建议开发避免使用delete from 整表的大事务删除语句

【其他变通方案】

2、 Binlog 记录的ROW模式下会产生大量的日志,改为MIXED模式,理论上也可以解决问题

3、 更换性能好的磁盘

来源:https://www.cnblogs.com/wangdong/p/9802532.html

标签:大事务,insert,慢
0
投稿

猜你喜欢

  • go redis之redigo的使用

    2024-05-22 17:46:37
  • python实现数据分析与建模

    2023-07-03 02:21:38
  • Python3解释器知识点总结

    2023-08-02 04:55:38
  • 不同浏览器的兼容一些写法

    2009-03-26 12:58:00
  • MySQL操作数据库和表的常用命令新手教程

    2024-01-23 23:18:36
  • Python如何在循环内使用list.remove()

    2023-06-07 09:11:33
  • python根据出生日期获得年龄的方法

    2022-05-22 23:52:46
  • Python实现连接MySQL数据库的常见方法总结

    2024-01-22 05:28:26
  • 基于Python绘制520表白代码

    2021-06-10 08:14:44
  • Python进行数据提取的方法总结

    2022-06-23 18:02:45
  • Python中的单继承与多继承实例分析

    2022-07-03 13:48:06
  • 运用ASP调用数据库中视图及存储过程

    2008-02-03 15:33:00
  • 利用PyQt5模拟实现网页鼠标移动特效

    2022-11-17 10:46:01
  • Python海龟绘图详解

    2022-07-26 02:02:02
  • WinHttp.WinHttpRequest--XmlHttp获取跳转页面的功能

    2010-03-22 14:34:00
  • Python实现的栈、队列、文件目录遍历操作示例

    2022-06-10 00:12:35
  • ASP实现上传图片自动压缩图片大小

    2010-01-25 12:47:00
  • Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    2022-04-07 09:50:44
  • 解决python执行较大excel文件openpyxl慢问题

    2021-06-25 15:58:04
  • Python openpyxl模块实现excel读写操作

    2023-07-17 20:15:25
  • asp之家 网络编程 m.aspxhome.com