mysql exec_time很长,这次是数据库卡了还是统计错了-爱可生

8909086097451473be4b7a1ff142a4ed.png

问题

f9ec09c3c2c1ac7b2ab158b1390b8201.png

一段 binlog 如上图,为什么这个 BEGIN 执行了 5 秒,是数据库卡了还是统计错了?

实验

先宽油做一个数据库:

a2544fbb6d1654c80253e8d58cd2e431.png

为了实验方便,我们改一下 mysql 的提示符,将命令行的当前时间显示在上面,

6744dd74ecdad37c3af0a6161c921e8d.png

将 binlog 格式改为 statement:

创建一个实验表:

4f6ac3ec1f756c4188acc3c4f09b3158.png

跑一个事务:

75dfa8e3b13fe26b13500524cf9e7dcc.png

解开对应的 binlog:

4cebedcfec642b5329dee078447cc5be.png

得到结果:

a634b054d8823a4d23c688b8d0a081c8.png

我们看到三组时间:

1. 黄色部分:

每个 binlog event 前都会带有一个时间戳,这个时间戳和我们执行每个语句时的开始时间对应(截图中会偶尔偏差 1s,是因为 SQL 是手工敲的,需要一些时间)

2. 红色部分:

exec_time,每个语句的 exec_time 与语句的执行时间对应,本例中是与 sleep 的时长对应,

而 BEGIN 语句的 exec_time 始终与第一个句子的执行时间相同,其原因是 BEGIN 是在第一个语句执行时,与第一个语句同时写入 binlog 的,这就引起了 exec_time 统计的偏差:BEGIN 的 exec_time 实际上是其后第一个语句的执行时间。

3. 每个语句前会有一个 SET TIMESTAMP,我们都知道其会影响语句中的时间函数,比如 now() 函数的时间基准。

我们重做一次实验,验证一下手工 SET TIMESTAMP 的影响:

330da1692b2c96935b7ebeef490a15a1.png

如上图,我们改变了 timestamp。来看一下 binlog 的表现:

e7b702b756e34f33903e8c7e259810fa.png

从图中可以看到:

1. binlog event 的时间戳随着 timestamp 变化,不再表示语句的实际开始时间,而是都置为设定的时间。

2. exec_time 计算出现了错误,不再表示实际的运行时间

由上面的实验,我们得到如下结论:

1. exec_time 是语句的运行时间。会受到 set timestamp 影响变得不准确

2. binlog event 的时间戳,是语句实际的开始时间。会受到 set timestamp 影响失去意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值