iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL慢查询中的commit慢和binlog中慢事务的区别
  • 247
分享到

MySQL慢查询中的commit慢和binlog中慢事务的区别

MySQL慢查询commitMySQL慢查询binlog慢事务MySQL慢查询 2022-06-15 12:06:23 247人浏览 安东尼
摘要

目录一、问题来源二、各自的判定方式三、证明四、总结常见原因总结,特殊情况除外。 一、问题来源 在分析性能问题的时候慢查询和binlog慢事务是常用的手段。最近在分析一个慢查询的,发现其中包含了大量的commit语句慢,但

常见原因总结,特殊情况除外。

一、问题来源

在分析性能问题的时候慢查询和binlog慢事务是常用的手段。最近在分析一个慢查询的,发现其中包含了大量的commit语句慢,但是在分析binlog慢事务的时候不能完成匹配。比如这段时间commit的语句可能有1000个,但是慢事务可能只有100个,这个差得也太多了,那么为什么会出现这种现象呢?

二、各自的判定方式

  • 慢事务 对于一个显示提交的(insert)事务通常如下:

  • GTID_LOG_EVENT和XID_EVENT是命令‘COMMIT’发起的时间。

  • QUERY_EVENT是第一个‘Insert’命令发起的时间。

  • MAP_EVENT/WRITE_ROWS_EVENT是每个‘Insert’命令发起的时间。

因此我们通常通过XID_EVENT的时间减去QUERY_EVENT的时间就得到了一个慢事务时间, 当然如果是自动提交的则不能这么计算 ,因为各个event都是语句发起的时间。

  • commit 慢的可能性

我们知道commit慢最可能的地方在binlog的刷盘或者等待半同步从库ACK,但是binlog中XID EVENT的时间却不包含这部分时间,也就是说binlog慢事务和慢查询中的commit记录的不是一个时间段。

  • 简要说明

如果我们以如下事务为例,进行简要说明

begin;
insert into it values(10);
commit;        
-- insert语句执行      -> QUERY_EVENT时间(T1)  
-- insert语句执行完成,判定insert语句是否为慢查询(T2)          
-- commit语句执行      -> GTID_LOG_EVENT和XID_EVENT时间(T3)
   flush
   fsync
                  -----> 传输binlog (sync_binlog=1)
                  <----   等待ACK   (rpl_semi_sync_master_wait_point=AFTER_SYNC)
   commit
-- commit语句执行完成,判定commit语句是否为慢查询(T4)
  • 判定insert语句是否慢的标准是T2-T1(-时间)

  • 判定commit语句是否慢的标准是T4-T3

  • 判定慢事务的标准是T3-T1

因此慢事务的判定和慢查询中commit慢的判定几乎没有什么交集,因此出现这种情况也是正常的,下面来证明。

三、证明

  • 主库:半同步超时时间为999999999。

  • 从库:设置sync_relay_log=1,并且断点设置在Mysql_BIN_LOG::flush_and_sync函数上,本函数是从库每次event写到relay log后受到 sync_relay_log=1 的影响必须要落盘的判定函数。

这样人为在断点处等待一下就显著的拉长了commit的时间,同时也证明半同步慢会影响commit慢,如下:

begin;
select now();   -T1
insert into it values(10);
select sleep(10);
select now();   -T2
commit; (断点在从库生效卡主ack) -T3
select now();   -T4

结果
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select now();      -T1
+---------------------+
| now()               |
+---------------------+
| 2022-06-12 22:20:43 |
+---------------------+
1 row in set (0.00 sec)

mysql> insert into it values(10);
Query OK, 1 row affected (0.10 sec)

mysql> select sleep(10);

+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.01 sec)

mysql> select now();      -T2 AND T3
+---------------------+
| now()               |
+---------------------+
| 2022-06-12 22:20:54 |
+---------------------+
1 row in set (0.00 sec)

mysql> commit;         
Query OK, 0 rows affected (21.64 sec)

mysql> select now();    -T4
+---------------------+
| now()               |
+---------------------+
| 2022-06-12 22:21:15 |
+---------------------+
1 row in set (0.00 sec)

我们来分析一下慢查询和binlog,这里加入了sleep(10)拖长了事务commit时间,因为insert太快了。

  • binlog慢事务 22:20:54(T2) - 22:20:43(T1) = 11秒左右(我们加入了sleep(10))

# at 12221
#220612 22:20:54 server id 613306  end_log_pos 12286 CRC32 0x3e019332   GTID    last_committed=40       sequence_number=41      rbr_only=yes
;
SET @@SESSioN.GTID_NEXT= '00320cc8-39f9-11ec-b5ba-000c2929706d:41';
# at 12286
#220612 22:20:43 server id 613306  end_log_pos 12360 CRC32 0x8dcde193   Query   thread_id=43    exec_time=1     error_code=0
SET TIMESTAMP=1655043643;
BEGIN
;
# at 12360
#220612 22:20:43 server id 613306  end_log_pos 12409 CRC32 0x0db68582   Rows_query
# insert into it values(10)
# at 12409
#220612 22:20:43 server id 613306  end_log_pos 12456 CRC32 0x363a48c7   Table_map: `mysemi`.`it` mapped to number 124
# at 12456
#220612 22:20:43 server id 613306  end_log_pos 12496 CRC32 0xd44e43f3   Write_rows: table id 124 flags: STMT_END_F
### INSERT INTO `mysemi`.`it`
### SET
###   @1=10 
# at 12496
#220612 22:20:54 server id 613306  end_log_pos 12527 CRC32 0x4d8d2c64   Xid = 547
COMMIT;
  • 慢查询中的commit慢 22:21:15(T4) - 22:20:54(T3) = 21秒

# Time: 2022-06-12T22:21:15.746223Z
# User@Host: root[root] @ localhost []  Id:    43
# Schema: mysemi  Last_errno: 0  Killed: 0
# Query_time: 21.641090  Lock_time: 0.000000  Rows_sent: 0  Rows_examined: 0  Rows_affected: 0
# Bytes_sent: 11
SET timestamp=1655043675;
commit;

这里很显然了慢查询记录的commit慢明显不包含在慢事务中。

四、总结

基于如上我们稍微做下总结,并且加上我们常有的认知,总结如下:

  • binlog慢事务中有记录,慢查询没有记录,可能事务中有大量的锁等待信息或者是事务没有及时提交。

  • 慢查询有记录,binlog慢事务中没有记录,可能语句本身为自动事务提交,自动提交的事务无法计算慢事务。

  • 如果确实是DML语句慢(排除加锁时间)导致的慢事务并且为显示(begin;commit)事务才会同时出现在binlog慢事务和慢查询中。

  • 慢查询中出现commit慢和binlog慢事务没有必然的关系,因为记录的时间完全不同。

  • 半同步慢ACK和日志刷盘慢会影响到commit慢,都会记录到慢查询(MGR before commit hook 处理慢也会)。

  • 如果binlog慢事务和某些慢查询中的select语句时间匹配则可能是事务中包含了select语句导致。

当然这只是常见的总结,很多特殊原因不好说,需要pstack等手段确认。

到此这篇关于MySQL慢查询中的commit慢和binlog中慢事务的差异的文章就介绍到这了,更多相关MySQL慢查询commit和binlog慢事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL慢查询中的commit慢和binlog中慢事务的区别

本文链接: https://www.lsjlt.com/news/32948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL慢查询中的commit慢和binlog中慢事务有什么区别
    这篇文章主要介绍了MySQL慢查询中的commit慢和binlog中慢事务有什么区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL慢查询中的commit慢和binlog中慢事务有什么区别文章都会有所收...
    99+
    2023-07-02
  • MySQL慢查询的坑
    目录一、慢查询配置 1-1、开启慢查询 二、Explain分析慢查询SQL 三、一些慢查询优化经验分享 3-1、优化LIMIT分页 3-2、排查索引没起作用的情况 总结 一条慢查询会...
    99+
    2024-04-02
  • mysql查询慢的原因
    这篇文章给大家分享的是有关mysql查询慢的原因的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysql慢查询有影响的原因:1、没有索引或没有用到索引;2、IO吞吐量小形成了瓶颈...
    99+
    2024-04-02
  • MySQL中慢查询指的是什么
    这篇文章主要介绍MySQL中慢查询指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!分析MySQL语句查询性能的方法除了使用EXPLAIN输出执行计划,还可以让MySQL记录下...
    99+
    2024-04-02
  • MYSQL中怎样优化慢查询
    今天就跟大家聊聊有关MYSQL中怎样优化慢查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MYSQL慢查询优化方法及优化原则:  1、日期大小...
    99+
    2024-04-02
  • MySQL中怎么实现慢查询
    MySQL中怎么实现慢查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1  什么是慢SQL?这里指的是MySQL慢...
    99+
    2024-04-02
  • MySQL中怎么定位慢查询
    本篇文章给大家分享的是有关MySQL中怎么定位慢查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。NO.1 慢查询日志定位解析MySQL 的慢...
    99+
    2024-04-02
  • mysql中怎么配置慢查询
    mysql中怎么配置慢查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。慢查询配置 MYSQL慢查询1. 慢查询有什...
    99+
    2024-04-02
  • MySQL的慢查询是什么
    这篇文章主要讲解了“MySQL的慢查询是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL的慢查询是什么”吧!MySQL慢查询分析 在我...
    99+
    2024-04-02
  • mysql慢查询的奇异事件有哪些
    这篇文章将为大家详细讲解有关mysql慢查询的奇异事件有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 打开mysql慢查询日志,发现有很多sql查询时间很短,明显...
    99+
    2024-04-02
  • Mysql慢查询日志的过程
    这篇文章主要介绍“Mysql慢查询日志的过程”,在日常操作中,相信很多人在Mysql慢查询日志的过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql慢查询日志的过程”...
    99+
    2024-04-02
  • mysql开启慢查询的方法
    小编给大家分享一下mysql开启慢查询的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql慢查询日志是mysql提供的...
    99+
    2024-04-02
  • mysql构造慢查询的方法
    这篇文章将为大家详细讲解有关mysql构造慢查询的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql构造慢查询的方法:1、修改配置文件,在【my.ini】增加相...
    99+
    2024-04-02
  • MySQL的慢查询实例分析
    这篇文章主要介绍“MySQL的慢查询实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的慢查询实例分析”文章能帮助大家解决问题。1 概念MySQL的慢查询,全名是慢查询日志,是MySQ...
    99+
    2023-06-28
  • MySQL中Sending data查询慢怎么办
    这篇文章将为大家详细讲解有关MySQL中Sending data查询慢怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、事故现场 SELECT o...
    99+
    2024-04-02
  • MySQL中查询缓慢的原因有哪些
    这期内容当中小编将会给大家带来有关MySQL中查询缓慢的原因有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。两个原则两条快于一条:***条SQL语句中,wher...
    99+
    2024-04-02
  • MySQL中的慢查询日志怎么开启
    这篇“MySQL中的慢查询日志怎么开启”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中的慢查询日志怎么开启”文章吧...
    99+
    2023-07-05
  • MySQL中有哪些慢查询语句
    本篇文章给大家分享的是有关MySQL中有哪些慢查询语句,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。通过SHOW FULL PROCESSLI...
    99+
    2024-04-02
  • 深入了解MySQL中的慢查询日志
    目录慢查询日志开启慢查询查看慢查询日志删除慢查询日志关闭慢查询日志慢查询日志 慢查询日志主要用来记录执行时间超过设置的某个时长的SQL语句,能够帮助数据库维护人员找出执行时间比较长、执行效率比较低的SQL语句,并对这些S...
    99+
    2023-03-19
    MySQL慢查询语句 MySQL慢查询优化
  • mysql中慢查询优化的示例分析
    这篇文章主要介绍mysql中慢查询优化的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一个用户反映线上一个SQL语句执行时间慢得无法接受。SQL语句看上去很简单(本文描述中修...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作