慢查询中关于MDL LOCK记录的变化

首先,这里不考虑innodb行锁,仅仅考虑MDL LOCK和DML/select 语句。我们知道到了8.0.28(包含)以后,记录慢查询的标准有变化,主要依赖的实际执行时间,而不是以前去掉了锁的时间(包含MDL LOCK和行锁)作为判定标准,具体参考,
https://www.jianshu.com/p/27547eb97d6a

以前通常通过lock_time来判断是否可能出现过innodb行锁堵塞和MDL LOCK堵塞,但是后来发现在8.0.28(包含)以后lock_time记录的时间变化了,通常并不包含innodb表的MDL LOCK时间,可以做测试如下,首先设置参数, set global long_query_time = 0,位了记录全部的满查询。

使用如下步骤,我们观察最后selet 语句的lock_time时间是否包含了MDL LOCK时间

步骤 session1 session2 session3
1. begin;select * from t1
2. alter table t1 add ic int;
3. select * from t1; (我们主要观察本语句lock time记录时间的不同)
4. commit;

其中第2步开始 session2和session3 因为mdl lock的原因不能获取到锁,直到第4步commit解锁。

8.0.28及之后的记录

# Time: 2024-10-08T17:40:48.426038+08:00
# User@Host: root[root] @ localhost []  Id:    29
# Query_time: 13.729913  Lock_time: 0.000019 Rows_sent: 2  Rows_examined: 2
SET timestamp=1728380434;
select * from t1;

注意这里的lock_time,几乎没有什么值,而这两个语句很明显的是等待在MDL LOCK下面,而lock_time几乎为0,因此在8.0.28及之后即便Lock_time为0不能说明语句没有遇到MDL LOCK

8.0.28及之前的记录,这里使用8.0.23

注意这里一定要将long_query_time 设置为0,否则如果主要等待在MDL LOCK上,去掉这部分时间后可能实际执行时间已经很短了,因此如果不设置long_query_time 为0不会记录任何慢查询。

# Time: 2024-10-08T18:02:47.417947+08:00
# User@Host: root[root] @ localhost []  Id:    19
# Query_time: 16.397964  Lock_time: 16.396849 Rows_sent: 1  Rows_examined: 1
SET timestamp=1728381751;
select * from t1;

这里我们能看到Lock_time实际上还是至少是包含了mdl lock的时间的。

大体原因

对于一般的DML和SELCET语句来讲,8.0.28之前的版本记录的lock _time的时候语句当跑到mysql_lock_tables函数的时候计算一次时间,这个时间实际上包含了MDL LOCK的时间,但是到了8.0.28(包含)以后这里发生了一些变化,仅仅记录了mysql_lock_tables函数里面消耗的时间,可以在函数找到如下几句,

ulonglong lock_start_usec = my_micro_time(); //仅仅是这一段 记录到了lock time
ulonglong lock_end_usec = my_micro_time(); //结束
thd->inc_lock_usec(lock_end_usec - lock_start_usec);//计算

但是innodb表的MDL LOCK堵塞并不包含在这个函数中,因此8.0.28及过后的MDL LOCK堵塞就不会记录了。
但是myisam的表锁是包含在其中,当我们使用myisam 测试表锁的时候会发现表锁的时间记录在里面,如下是8.0.36的测试,


image.png

myisam表记录的慢查询如下,

# Time: 2024-10-08T18:27:27.772193+08:00
# User@Host: root[root] @ localhost []  Id:    28
# Query_time: 67.663484  Lock_time: 67.636786 Rows_sent: 0  Rows_examined: 4
SET timestamp=1728383180;
delete from testmyisam;

可以看到即便是8036,myisam的表锁也包含在Lock_time中。

总结

  • 对于DML/SELECT 语句来讲,在8.0.28(包含)以后慢查询中的lock_time通常不包含MDL LOCK堵塞的时间,因此即便lock_time为0不能说明没有遇到MDL LOCK堵塞,但是lock_time包含了innodb 行锁堵塞的时间。
  • 对于DML/SELECT 语句来讲,在8.0.28之前的慢查询中的lock_time通常包含了MDL LOCK堵塞的时间,且包含innodb 行锁堵塞的时间。
  • 对于myisam的表锁堵塞始终包含在Lock_time中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容