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

 更新时间:2018年10月21日 11:50:19   作者:wangdong  
这篇文章主要给大家介绍了关于MySQL因大事务导致Insert慢的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

【问题】

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、 更换性能好的磁盘

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • MySQL删除表时I/O错误的原因分析与解决

    MySQL删除表时I/O错误的原因分析与解决

    这篇文章主要给大家介绍了关于MySQL删除表时I/O错误的原因分析与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • MySql 8.0.16-win64 安装教程

    MySql 8.0.16-win64 安装教程

    本文通过图文并茂的形式给大家介绍了MySql 8.0.16-win64 安装教程 ,需要的朋友可以参考下
    2019-06-06
  • 十个实用且简单的MySQL函数

    十个实用且简单的MySQL函数

    本文给大家分享了十个实用且简单的MySQL函数,需要的朋友可以参考下
    2018-01-01
  • MySQL使用GROUP BY使用技巧和注意事项总结

    MySQL使用GROUP BY使用技巧和注意事项总结

    GROUP BY 子句是 在MySQL 中用于将查询结果按照指定的列或表达式进行分组的关键字,它通常与聚合函数一起使用,能够对每个分组进行统计或计算,本文给大家总结了MySQL使用GROUP BY使用技巧和注意事项,需要的朋友可以参考下
    2024-05-05
  • 为什么代码规范要求SQL语句不要过多的join

    为什么代码规范要求SQL语句不要过多的join

    SQL中的join可以根据某些条件把指定的表给结合起来并将数据返回给客户端,那么在项目开发中如果需要使用join语句,如何优化提升性能?本文就来详细的介绍一下
    2021-06-06
  • 使MySQL查询区分大小写的实现方法

    使MySQL查询区分大小写的实现方法

    我们在MySQL中使用SELECT语句查询时,可不可以使查询区分大小写?今天从网络上找到了方法,现总结如下。
    2010-12-12
  • Windows安装MySQL后怎么开启root的网络访问权限

    Windows安装MySQL后怎么开启root的网络访问权限

    Windows安装MySQL后默认只能本机访问,怎么开启网络访问,本文给大家介绍介绍了Windows安装MySQL后怎么开启root的网络访问权限,需要的朋友可以参考下
    2023-08-08
  • MySQL 慢查询日志深入理解

    MySQL 慢查询日志深入理解

    这篇文章主要介绍了MySQL 慢查询日志的相关资料,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-04-04
  • 详解mysql数据去重的三种方式

    详解mysql数据去重的三种方式

    本文主要介绍了mysql数据去重的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 简单了解 MySQL 中相关的锁

    简单了解 MySQL 中相关的锁

    这篇文章主要介绍了简单了解 MySQL 中相关的锁,重点介绍InnoDB中的锁相关知识,包括锁的概念及分类解析,对MySQL锁相关感兴趣的朋友跟随小编一起看看吧
    2021-05-05

最新评论