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 insert语句操作实例讲解
insert的语法 复制代码 代码如下: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [LOW_PRIORITY | DELAYED | HIGH
-
mysql 操作总结 INSERT和REPLACE
言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE.在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL中的更新语句. 一.INSERT和REPLACE INSERT和REPLACE语句的功能都是向表中插入新的数据.这两条语句的语法类似.它们的主要区别是如何处理重复的数据. 1. INSERT的一般用法 MySQL中的INSERT语句和标准的INSERT不太一样,在标准的SQL语句中,一次插入一条记录
-
MYSQL 小技巧 -- LAST_INSERT_ID
其实,这两个是有区别的,LAST_INSERT_ID() 能返回 bigint 值的id.而,mysql_insert_id 返回的是 int .如果你 的id 是 unsigned int,或者 bigint 的 .那么,可能是返回的是错误的.而要用 LAST_INSERT_ID() 代替. 还有些朋友,返回的都是 0,不知道怎么回事,其实 LAST_INSERT_ID() 返回的是 AUTO_INCREMENT 的 ID. 如果,表结构中,没有设置,AUTO_INCREMENT 那么也无法返
-
MySQL优化insert性能的方法示例
MySQL性能优化 MySQL性能优化就是通过合理安排资源,调整系统参数使MySQL运行更快.更节省资源.MySQL性能优化包括查询速度优化.更新速度优化.MySQL服务器优化等.本篇博客将从查询优化.数据库结构优化.MySQL服务器优化3个方面介绍. MySQL数据库优化,一方面是找出系统瓶颈,提高MySQL数据库整体性能:另一方面需要合理的结构设计和参数调整,以提高用户操作响应速度:同时还要尽可能节省系统资源,以便系统可以提供更大负荷的服务.例如,通过优化文件系统,提高磁盘I\O的读写书读:
-
MySQL中insert语句的使用与优化教程
MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须使用单引号或者双引号,如:"value"
-
mysql中insert与select的嵌套使用方法
本文讲述了mysql中insert与select的嵌套使用的方法,对于初学MySQL的朋友有一定的借鉴价值. 这里需要实现在mysql从多个表中组合字段然后插入到一个新表中,通过一条sql语句实现该功能需求.具体情形是:有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,我们可以使用如下的语句来实现: INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name 当然,上
-
正确使用MySQL INSERT INTO语句
以下的文章主要介绍的是MySQL INSERT INTO语句的实际用法以及MySQL INSERT INTO语句中的相关语句的介绍,MySQL INSERT INTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好. INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... MySQLINSERT INTO SELEC
-
MySql insert插入操作的3个小技巧分享
1.插入的数据来源自其他表 表A有id, cola 字段 表B有id, cola, colb...等字段,其中id都为主键,cola为相同名字的列 现想将表B中colb>1000的记录都插入表A中,SQL语句可以这样写: 复制代码 代码如下: insert into A(id,cola) select id,cola from B where colb>1000 2.插入时排除(忽略)重复记录 现表A中有一部分记录了,再做如1中的插入操作可能遇到重复的key导致操作失败 复制代码 代码如下:
-
MySQL因大事务导致的Insert慢实例分析
[问题] INSERT语句是最常见的SQL语句之一,最近有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end [初步分析] 从等待资源来看,大部分时间消耗在了innodb_log_file阶段,怀疑可能是磁盘问题导致,经过排查没有发现服务器本身存在硬件问题 后面开启线程上升时pstack的自动采集,定位MySQL线程等待的位置. [分析过程] 部署了pstack的自动抓取后,出现过6次thr
-
MySQL权限控制和用户与角色管理实例分析讲解
目录 一.MySQL用户登录 二.用户管理 三.权限控制 四.角色管理 一.MySQL用户登录 一般在本机上我们的登录命令:mysql -u root -p+密码 这里介绍命令的作用:-u 指定用户名-h 指定主机地址(默认为localhost)-p 指定用户输入的密码-P 指定服务器的端口(默认为3306) 二.用户管理 什么是用户管理呢?在创建了一个数据库后,数据库的管理员或者是创建者可以创建用户并同时对该用户做出限制(也就是用户的权限),当其他人想要访问该数据库时,可以通过使用该用
-
mysql触发器之创建多个触发器操作实例分析
本文实例讲述了mysql触发器之创建多个触发器操作.分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的.废话不多说,咱们开始正文哈. 在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器. mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器.当事件发生时,触发器将依次激活.我们来参考创建第一个触发
-
mysql滑动订单问题原理与解决方法实例分析
本文实例讲述了mysql滑动订单问题原理与解决方法.分享给大家供大家参考,具体如下: 先根据以下代码来创建表MonthlyOrders并导入一定的数据 CREATE TABLE MonthlyOrders( ordermonth DATE, ordernum INT UNSIGNED, PRIMARY KEY (ordermonth) ); INSERT INTO MonthlyOrders SELECT '2010-02-01',23; INSERT INTO MonthlyOrders SE
-
Sql Server事务语法及使用方法实例分析
本文实例讲述了Sql Server事务语法及使用方法.分享给大家供大家参考,具体如下: 事务是关于原子性的.原子性的概念是指可以把一些事情当做一个不可分割的单元来看待.从数据库的角度看,它是指应全部执行或全部不执行的一条或多条语句的最小组合. 为了理解事务的概念,需要能够定义非常明确的边界.事务要有非常明确的开始和结束点.SqlServer中的每一条select.insert.update.delete语句都是隐式事务的一部分.即使只发出一条语句,也会把这条语句当做一个事务-或执行语句的所有内容
-
PHP大文件切割上传功能实例分析
本文实例讲述了PHP大文件切割上传功能.分享给大家供大家参考,具体如下: 大家都知道php上传文件有限制,如果没有修改过php.ini文件的话,默认的上传大小限制为2M,那么该如何上传大文件了,比如说上传一个1G多的大文件,可以使用大文件切割上传的方式来解决. 何为大文件切割上传? 原理:利用HTML5的新特性,将文件内容切割成分段的二进制信息,然后每次向服务器上传一段,而服务器,只需要把我们每次上传的二进制信息整合存储到一个文件中,那么最后这个文件就是所上传的文件. 由于php.ini默认的上
-
MySQL 5.7并发复制隐式bug实例分析
前言 我们MySQL线上环境大部分使用的是5.7.18的版本,这个版本已修复了很多bug,但针对主从复制的bug还是有很多的,尤其是一些组复制.并行复制的bug尤为突出,在5.7.19版本有做相应改善和修复.所以建议5.7.19之前的版本还是不要使用mgr和并发复制的功能,如使用建议升级至5.7.19(含)以后的版本. 我这里遇到的问题主要是莫名其妙的数据同步出现问题,无法执行stop slave,数据不一致等现象,经过查看发现是版本bug所致,所以对已上线的从库关闭并发复制,对未上线的系统实行
-
MySQL为什么要避免大事务以及大事务解决的方法
什么是大事务 运行时间比较长,长时间未提交的事务就可以称为大事务 大事务产生的原因 操作的数据比较多 大量的锁竞争 事务中有其他非DB的耗时操作 ... 大事务造成的影响 并发情况下,数据库连接池容易被撑爆 锁定太多的数据,造成大量的阻塞和锁超时 执行时间长,容易造成主从延迟 回滚所需要的时间比较长 undo log膨胀 ... 如何查询大事务 **注**:本文的sql的操作都是基于mysql5.7版本 以查询执行时间超过10秒的事务为例: select \* from information\
-
全面了解MySql中的事务
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的运用于订单系统.银行系统等多种场景.如果有以下一个场景:A用户和B用户是银行的储户.现在A要给B转账500元.那么需要做以下几件事: 1. 检查A的账户余额>500元: 2. A账户扣除500元: 3. B账户增加500元: 正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜.那如果A账
-
MySQL四种事务隔离级别详解
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位. 2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 .比如A向B转账,不可能A扣了钱,
随机推荐
- 浅谈Java绝对布局 原创
- Java Web开发之访问路径问题分析
- Python命令行参数解析模块getopt使用实例
- 基于BootStrap multiselect.js实现的下拉框联动效果
- JS 俄罗斯方块完美注释版代码
- php多层数组与对象的转换实例代码
- PHP中的错误处理、异常处理机制分析
- 防范ASP木马的十大基本原则强列建议看下
- Access模糊查询查不到数据的解决方法
- windows下修改Mysql5.7.11初始密码的图文教程
- js关于命名空间的函数实例
- Python json 错误xx is not JSON serializable解决办法
- Ajax并不神秘:揭下各种Ajax控件和类库的小裤衩
- 详解Linux误删用户家目录的恢复方法
- jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
- 用自定义图片代替原生checkbox实现全选,删除以及提交的方法
- 深入剖析java中的集合框架
- Android 三种动画详解及简单实例
- Yii2选项卡的简单使用
- Android中的Permission权限机制介绍