Mysql数据库Slow_log中的lock_Time和Query_time

简介: 主要用简单的例子来说明,slow log里的lock_time和query_time的关系,得出的结论是: 当一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的(如果有lock.

实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 

说明:主要用简单的例子来说明,slow log里的lock_time和query_time的关系,得出的结论是:
当一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的(如果有lock_time),大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),也不会记录到slow log中的,故锁等待的时间并不决定记不记录slow log,下面的测试多是基于自建mysql进行

现象展示

有时在查slow log的信息时,可能会遇到,下面这种情况:

fae69244bbe2f87993e9806ccb4bf08623a9fafb

或者:

e5445953d7710c45ada5d1bab2bf71fec485182d

上面的信息,都出现了lock_time的时间很长的情况,并且sql的执行时间(query_time)也会出现时间很长的情况

 

问题复现

构建测试数据,手动造成锁等待,复现下这类问题

现象1:无自建主键的锁等待

无自建主键测试数据,locking Reads的结果和执行时间:

1ff4d75c33654f6a8b4f702b3acd22a0587b23ba

上图可以大概判断,select count(1) from MOCK_DATA for update;的执行时间一般会大于小于15S且大于5S

测试1::设置long_query_time为15s:

46fcb570734457dd2db6f80b3582d203075330ec

进行如下测试:

Session1:

534463011cbf354ec4776fddddc57a82d6d582be

Session1执行查询,不提交,不回滚

Session2:

64826de56699e316b3ed0f29fbc3af0e4345fe36

Session2被阻塞

 

Session1:

1909c53d1552cc809c116b0a60178c1521f9be42

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

0c29b5fd7ed27db62ed0710ef4835f18af10b39e

Session2执行完成,执行时间是28.95sec

 

Session3:

查询mysql.slow_log,看下结果:

9b9338ec53a23f40ed7b1357603f63dbc7b616ad

没有看到session2执行的for update操作的sql

测试2:设置long_query_time为5s

7f1fa2e886ff3c6c9695e9ba94686a00d5ad9fb3

重复测试1的测试:

Session1:

12efd0200b5be5e7a31365fb20c5878eb58c2c04

Session 1执行查询,不提交不回滚

 

Session2:

5b8f31735431b00d20649578ff3cf4578e988bf6

Session2阻塞

 

Session1:

fc090b6243b3765b86590387f59b343549e4c2b0

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

1dbf3f4d780a168a2e2607a178be1ee947432c75

Session2执行完成,执行时间是47.66sec

 

Session3:

查询mysql.slow_log,看下结果:

8376f68f2605a6a96e4dfd8613de1ce0726bc5d6

从上图可以看到,session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是47s,在这47s里,锁定的时间(lock_time)是38s

 

结论:

当一个无自建主键的sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间才是(该测试中,执行时间=47s-38s=9s,这个计算可能会有偏差),当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中

 

现象2:有自建主键的锁等待

有自建主键测试数据,locking Reads的结果和执行时间:

e3ad8149443b8a325162d90fd20eafc47ef17a72

上图可以大概判断,select count(1) from MOCK_DATA where id<10000000 lock in share mode;的执行时间一般会大于小于15S且大于5S,

测试1::设置long_query_time为15s:

7e91ac40b675d8a713c7b070ae0659876a269829

进行如下测试:

Session1:

0de214bac0145ed94df00b97f1ba6a328df2a6ff

Session1执行查询,不提交,不回滚

Session2:

291896bbda3ab24d69b92a14cf9e0b84b3877dd5

Session2被阻塞

 

Session1:

71366e4b15f66da9126ad0a82cc1688fe7ccf440

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

31d6c817ab23316e2c659f87b72cbe4100474211

Session2执行完成,执行时间是31.04sec

 

Session3:

查询mysql.slow_log,看下结果:

ac80cfc6e4f11bfa4cbd1d20a7628d8d245359af

没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录

测试2:设置long_query_time为5s

7f1fa2e886ff3c6c9695e9ba94686a00d5ad9fb3

重复测试1的测试:

Session1:

9ba6f742907da23703a837f8c20eb80ecbf43765

Session 1执行查询,不提交不回滚

 

Session2:

10eb893fe8488c4b7975ecb378e35037fa974d56

Session2阻塞

 

Session1:

fc090b6243b3765b86590387f59b343549e4c2b0

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

c6f38a8b5660143c858852d83f78285387bb480b

Session2执行完成,执行时间是1min 0.40sec

 

Session3:

查询mysql.slow_log,看下结果:

5bfc8605d2603a6a78ad20bc534d10c78a119efb

从上图可以看到,最新测试的session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是1分钟,在这1分钟里,锁定的时间(lock_time)是51s

 

结论:

当使用主键查询的一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中

 

现象3:secondary index的锁等待

Secondary index测试数据,locking Reads的结果和执行时间:

104106f868ebd0fa2945e8fa5f11bc83f78f8aa5

上图可以大概判断,select count(1) from MOCK_DATA where ram_num=7 for update;的执行时间一般会大于小于10S且大于1S,

测试1::设置long_query_time为10s:

d699d27ccdd3e851affa63134f5c9bdb1df0b865

进行如下测试:

Session1:

74010215c285b09f082a77125426c958efbdf6f6

Session1执行查询,不提交,不回滚

Session2:

3b118cd15b179c4830dfd9de0559031f4900cd26

Session2被阻塞

 

Session1:

71366e4b15f66da9126ad0a82cc1688fe7ccf440

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

8fb014dc3678e48d042e85498252d62fcc605293

Session2执行完成,执行时间是1min 44.02sec

 

Session3:

查询mysql.slow_log,看下结果:

98e39549e3def0bd276daa803cb68f2786ce15f9

没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录

测试2:设置long_query_time为1s

0001837f31066811a704108e4987b690ca1608c2

重复测试1的测试:

Session1:

080ad7121417b0f5385b58418cfdea3753420e73

Session 1执行查询,不提交不回滚

 

Session2:

f8ccfdb513e61a14275e6d47749b7426000abb63

Session2阻塞

 

Session1:

fc090b6243b3765b86590387f59b343549e4c2b0

等待一段时间后Session1回滚(不要超过锁等待超时时间)

 

Session2:

66f3c6411d3c3defee149339ab60d8563929dbb3

Session2执行完成,执行时间是1min 6.66sec

 

Session3:

查询mysql.slow_log,看下结果:

ef385ea901d4062888a39a3ea859bef294b9b1ac

从上图可以看到,最新测试的session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是1分06秒,在这1分06秒里,锁定的时间(lock_time)是1分02秒

 

结论:

当使用secondary index查询的一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
分布式计算 数据可视化 大数据
Hue--介绍、功能、架构 | 学习笔记
快速学习 Hue--介绍、功能、架构
3448 0
Hue--介绍、功能、架构 | 学习笔记
|
存储 监控 安全
比较入站和出站防火墙规则
本文介绍了入站与出站流量的区别,以及如何通过配置入站和出站防火墙规则来保护网络安全。入站规则拦截恶意来源的流量,防止攻击;出站规则监控合法流量,阻止数据泄露。同时,推荐使用 EventLog Analyzer 工具实时监控防火墙规则变更、简化日志审计、分析流量和审核 VPN 日志,帮助构筑更安全的网络防线,快速响应潜在威胁。
2038 1
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
1493 3
Mysql高可用架构方案
|
机器学习/深度学习 Linux Python
服务器上后台运行python程序
服务器上后台运行python程序
1967 0
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
573 1
|
SQL 监控 关系型数据库
使用 pt-query-digest 工具分析 MySQL 慢日志
【8月更文挑战第5天】使用 pt-query-digest 工具分析 MySQL 慢日志
1622 3
使用 pt-query-digest 工具分析 MySQL 慢日志
|
存储 监控 前端开发
如何开发项目管理系统中的合同管理板块?(附架构图+流程图+代码参考)
合同管理是项目管理系统中的核心模块,涵盖合同生命周期、审批流程、履行监控及变更处理。通过数字化、自动化手段,提升管理效率,降低风险,确保合规性。本文详解合同管理模块的设计与开发,包括功能实现、业务流程及技术应用,助力企业构建高效管理系统。
|
安全 Java Android开发
GDA反编译工具全面指南:从入门到高级应用
GDA(Generic Dalvik Analyzer)是一款专为Android逆向工程和安全研究设计的高性能反编译工具,由中国团队开发。它采用C++编写,无需依赖Java虚拟机,具备低资源消耗与高分析效率的优势。GDA支持多种文件格式的反编译,如APK、DEX、JAR等,并集成了恶意行为检测、隐私泄露分析、漏洞扫描等功能。同时提供变量追踪、路径解析、脚本自动化等实用特性,广泛应用于逆向分析、安全审计与漏洞挖掘。作为国产优秀逆向工具,GDA凭借其独立运行能力、丰富的功能和持续更新,在全球范围内受到分析师青睐。
2270 0
|
存储 关系型数据库 MySQL
阿里巴巴MYSQL 开发规范
阿里巴巴MYSQL 开发规范
2380 0

热门文章

最新文章