MySQL因大事务导致的Insert慢实例分析
作者:wangdong 发布时间:2024-01-22 22:07:54
【问题】
INSERT语句是最常见的SQL语句之一,最近有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end
【初步分析】
从等待资源来看,大部分时间消耗在了innodb_log_file阶段,怀疑可能是磁盘问题导致,经过排查没有发现服务器本身存在硬件问题
后面开启线程上升时pstack的自动采集,定位MySQL线程等待的位置。
【分析过程】
部署了pstack的自动抓取后,出现过6次thread concurrency >=50的告警(每次告警时会有大量的慢查询产生),有3次抓到了现场。
并发线程升高时,有50多个线程卡在Stage_manager::enroll_for
函数,处于group commit阶段
线程0x519c5940对应的SQL语句如下,已经执行18秒
Stage_manager::enroll_for
函数的作用实现了多个线程在flush_stage阶段的排队。简单来说,对于一个分组的事务,是被leader线程去提交的,其他线程处于排队等待状态,等待leader线程将该线程的事务提交完成。
如果第一个线程执行慢,后面的线程都处于等待状态,整组事务无法提交。
流程也可以理解如下,
Session A COMMIT-->拿到锁-->进行binlog写-->commit完成
Session B COMMIT-->等待锁--------------------------->拿到锁-->进行binlog写-->commit完成
第一个线程为什么执行很慢,分析了发生告警时间段的日志文件,发现日志中存在2个15M和20M的大事务
查看日志明细,存在delete from的大事务删除语句,约包含23W条记录,ROW模式下删除23W条记录,会产生大约20M的日志文件,刷盘时间较长,阻塞了同一个分组下其他事务的提交。
事务的开始时间与告警时间吻合
积压的分组下事务集中刷盘,反应到磁盘指标上可以看到在问题时间段的disk_write_kbytes指标出现明显的上升
【优化方案】
1、 建议开发避免使用delete from 整表的大事务删除语句
【其他变通方案】
2、 Binlog 记录的ROW模式下会产生大量的日志,改为MIXED模式,理论上也可以解决问题
3、 更换性能好的磁盘
来源:https://www.cnblogs.com/wangdong/p/9802532.html


猜你喜欢
- 一、表格与键概念主键:可唯一表示该资料(可以设置多个列表为主键)设置外键进行表与表的相连,且外键必须是其他表的主键(外键也可以设置自己表格的
- IIS设置首先打开IIS就不用说了巴第2步右建默认网站属性第3步主目录选项卡点击第3步的配置按钮弹出窗口的设置,至此IIS设置完毕任意编辑器
- request获取post请求中的json数据def hello(request): data = json.loads(request.b
- 思路:利用time函数返回的时间字符串与指定时间字符串做比较,相等的时候执行对应的操作。不知道大家的思路是什么,感觉这样比较耗CPU。。。。
- 如果有空格就用%20代替,如果有其它字符就用%ASCII代替,如果有汉字等四个字节的字符,就用两个%ASCII来代替。不过有时候我们也需要将
- 玩过knockoutjs的都知道,有一个强大的功能叫做component,而这个component有个牛逼的地方就是拥有自己的viewmod
- hello.html 文件代码如下:HelloWorld/templates/hello.html 文件代码:<h1>{{ he
- 前言双端比较算法是vue2.x采用的diff算法,本篇文章只是对双端比较算法粗略的过程进行了一下分析,具体细节还是得Vue源码,Vue的源码
- Python-OpenCV环境的配置看上一篇OpenCV环境的配置本篇主要介绍一下OpenCV的基本使用和相关函数的介绍。以下所有操作都基于
- 自定义函数import requestsfrom bs4 import BeautifulSoupheaders={'User-Ag
- 1,IE使用attachEvent/detachEvent方法来添加和删除事件 * ;w3c使用addEventListener/remov
- pytorch构建双模型第一部分:构建"se_resnet152","DPN92()"双模型impo
- 导读:这篇论坛文章主要介绍了使用SQL Server升级顾问的具体步骤,详细内容请参考下文。微软提供了SQL Server 2008升级顾问
- 下边是我对部分内容的总结,里边偏向了T-SQL语句实现的总结,对于SQL Server Management Studio中对象管理器的操作
- 其实如果要去除字符串前后的空格很简单,那就是用strip(),简单方便>>> ' A BC '.strip
- 本文实例讲述了Python线程threading模块用法。分享给大家供大家参考,具体如下:threading-更高级别的线程接口源代码:Li
- 1、添加依赖<dependency><groupId>com.baomidou</groupId><
- 概述在 TypeScript 中我们会使用泛型来对函数的相关类型进行约束。这里的函数,同时包含 class 的构造函数,因此,一个类的声明部
- 有时候我们需要判断两个字符串内容是否相等,判断内容相等,我们用‘==',但是有时候发现print(str1)和print(str2)
- 01直接生成这类方法是利用基本程序软件包numpy的随机数产生方法来生成各类用于聚类算法数据集合,也是自行制作轮子的生成方法。一、基础类型1