Mysql数据库Slow_log中的lock_Time和Query_time

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 主要用简单的例子来说明,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_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;
相关文章
|
17天前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
87 6
|
1月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
74 6
|
1月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
288 4
|
2月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
205 0
|
7月前
|
存储 缓存 监控
【YashanDB数据库】数据库运行正常,日志出现大量错误metadata changed
数据库运行正常,日志出现大量错误metadata changed
|
7月前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
546 90
|
5月前
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
229 23
|
6月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
7月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
165 16
|
8月前
|
关系型数据库 MySQL 数据库
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
535 4
图解MySQL【日志】——两阶段提交

推荐镜像

更多