对MySQL DBA而言,咱们常常遇到 slow log,本文经过源码和案例实践来抽丝剥茧,slow log断定是否会加上锁等待时间?

以上代码来自于percona 5.7.23版别 其间

说明:T2(sql履行结束时间) - T1(取得锁的实践时间) = T(这个得出来的是SQL履行的实践时间),因而res也就是实践的履行时间。根据实践时间与变量的long_query_time比较:

三 手工检验案例
环境说明:
3.1 检验进程
3.2 一个比较特别的检验
slow log输出如下:
# Time: 2019-07-05T04:27:42.785888Z
# User@Host: root[root] @ localhost [] Id: 3129
# Query_time: 12.035846 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
SET timestamp=1562300862;
insert into tx values(1);
独特的是竟然记载到了slow log里面,下面根据debug到的源码进行说明这个问题 A8站源码交易平台
insert SQL的进口是函数
insert会调用函数open_tables_for_query
open_tables_for_query又会调用open_tables

跑到这儿翻开表报错
到这儿SQL结束,回来给客户端信息 
这儿是记载slow log的进口
正常情况下,假如表存在那么会对表进行加锁
A8站源码交易平台
lock tables会调用mysql_lock_tables
mysql_lock_tables函数结束会设置after_lock时间戳,也就是前面提到的utimeafter_lock
由于在翻开表的时间就报错了,所以utime_after_lock即为0,这样根据公式
直接由其时时间-0,逾越long_query_time就被认定为slow query,也就记载在了slow log傍边。为了便于了解,画成流程图如下:
