MySQL45讲之查询慢或者阻塞

前言

本文介绍了表锁定和执行速度慢的实例,以及表锁定时的故障排除方法。

[En]

This paper introduces examples of table locking and slow execution, as well as troubleshooting methods when table locking occurs.

锁表

1. 等MDL锁

比如像 select * from t where id=1; 长时间不返回,可能是因为等 MDL 锁而阻塞。

排查方法:
使用 show processlist; 查看线程状态

MySQL45讲之查询慢或者阻塞

由上图可知,其他线程正在表上请求或者持有 MDL 写锁,所以阻塞了 select 获取 MDL 读锁。

如果想模拟获取 MDL 写锁,可以通过 lock table t write; 实现。

解决办法:

只需要找到阻塞 select 获取 MDL 读锁的线程,kill 掉就可以了。因为 MDL 是表级锁,所以查询 sys 表的 schema_table_lock_waits 字段,就可以得到阻塞的 process id。

MySQL45讲之查询慢或者阻塞

2. 等待flush

MySQL里面对表做flush操作的用法,一般有以下两个:

关闭表 t
flush tables t with read lock;

关闭所有打开的表
flush tables with read lock;

等待 flush 表示一个线程正要对表做 flush 操作,但是被其他线程阻塞,而 flush 操作又会阻塞后来的 select 查询操作。

排查方法:
很简单,通过 show processlist; 就可以发现。

MySQL45讲之查询慢或者阻塞

3. 等行锁

MySQL45讲之查询慢或者阻塞

如上图,session A 对 id=1 的行上了行锁,且事务一直没有提交,导致阻塞 session B 对该行执行当前读。

排查方法:
同样通过 show processlist; 方法排查。

MySQL45讲之查询慢或者阻塞

其中,id=8 行就是被阻塞的查询,线程被阻塞状态为 statistics。

解决办法:

同样是找到阻塞的线程 id,然后 kill 掉。行锁是 innodb 引擎提供的,通过查询 sys 表的 innodb_lock_waits 行可以得到 process id。

MySQL45讲之查询慢或者阻塞

执行慢

MySQL45讲之查询慢或者阻塞

session A 中第二条查询语句比第一条查询快很多。因为第二条加锁查询是当前读,直接获取当前行数据;第一条查询是快照读,因为 session B 在之前对 id=1 的行更新了 100 万次,所以需要根据 undo log 日志对当前行执行 100 万次回滚操作。

总结

对于阻塞问题的排查,使用 show processlist;。对于阻塞问题的解决,通过在 sys 表中查询阻塞线程的 process id,比如 schema_table_lock_waitsinnodb_lock_waits

提问

存在索引的字段进行当前读,我们知道会在索引树上对符合的行上锁,那对于 select * from t where c = 5 for update; (字段 c 不存在索引)语句如何上锁,什么时候释放锁?

回答:
(1)提交读 rc 隔离级别下

因为字段 c 不存在索引,所以进入存储引擎后,会在主键索引树上对全表加排他锁。在此优化器做了一些优化,返回 MySQL server 后,会判断出不符合条件的行,即 c != 5 的行,释放这些行上的排他锁。最后,在事务提交的时候释放锁。

所以,在一个事务执行完这条 SQL 后,在另一个事务可以对 c != 5 的行进行更新和删除操作,并且可以在任何位置执行插入操作(因为 rc 模式下,没有使用间隙锁)。

(2)可重复读 rr 隔离级别下

因为字段 c 不存在索引,所以进入存储引擎后,会在主键索引树上对全表加排他和间隙锁。最后,在事务提交的时候释放锁。

所以,在一个事务执行完这条 SQL 后,在另一个事务对全表任何一行的更新操作都需要等待,在全表任何位置的插入操作也需要等待。

参考

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-query-slow-or-wait.html
Author: flowers-bloom
Title: MySQL45讲之查询慢或者阻塞

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508120/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL实战45讲 17

    17 | 如何正确地显示随机消息? 场景:从一个单词表中随机选出三个单词。 表的建表语句和初始数据的命令如下,在这个表里面插入了 10000 行记录: CREATE TABLE w…

    数据库 2023年6月14日
    065
  • 1_MySQL

    概念: 数据库是按照数据结构来组织, 存储和管理数据的仓库, 是一个长期存储在计算机内的, 有组织的, 有共享的, 统一管理的数据集合 分类: 网状结构数据库: 美国通用汽车公司I…

    数据库 2023年6月11日
    073
  • Java8-Stream流

    Java8-Stream基础操作 JAVA技术交流群:737698533 在学习Stream之前必须有Lambda,的基础 Stream是Java8的新特性,可以进行对集合进行一些…

    数据库 2023年6月16日
    094
  • MySQL 数据备份与恢复

    数据备份 使用 mysqldump 命令可以将数据库中的数据备份成一个文本文件,表的结构和数据以 SQL 的形式将存储生成的文本文件 mysqldump -u username -…

    数据库 2023年5月24日
    0131
  • 手把手教你定位线上MySQL锁超时问题,包教包会

    昨晚我在床上睡着了,突然来了一条短信。 [En] I was asleep in bed last night when suddenly a text message came….

    数据库 2023年5月24日
    083
  • 0812Java核心技术卷(1)随笔

    自增运算符与自减运算符 这些运算符改变了变量的值,所以它的操作数不能是数值。例如4++就是一条非法语句不建议在其他表达式内部使用++,因为这样会降低代码可读性,产生bug Orig…

    数据库 2023年6月14日
    0102
  • Vue3提高效率小技巧

    问题1:Vue3使用了setup API,无法访问到this,虽然提供了getCurrentInstance API,但访问全局变量时感觉比Vue2使用方式更繁琐了,因此想了个捷径…

    数据库 2023年6月11日
    093
  • JavaWeb过滤器Filter(附tomcat部分源码分析)

    过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理。过滤器可…

    数据库 2023年6月16日
    0124
  • 加班整理出来的MySQL数据库基本操作送给大家,非常详细!

    哈喽兄弟们,中秋闲着没事,整理了一些数据库的基本操作,分享给大家,希望对大家有所帮助~ ; 一、SQL语句 (mysql 数据库中的语言) show databases;查看数据库…

    数据库 2023年6月14日
    0104
  • Golang环境安装

    一、下载地址 Golang: Downloads – The Go Programming Language GoLand编辑器: Download GoLand: A…

    数据库 2023年6月14日
    068
  • starter包~mica-auto自动生成spring.factories等元文件

    首先,进行springboot2.7之后,官方不推荐使用 /META-INF/spring.factories,转成和SPI比较类似的 /META-INF/spring/org.s…

    数据库 2023年6月6日
    072
  • 标识多个物体并返回物体中心坐标方法的实现

    概述 在图像处理时,可能不可避免的需要计算图像中目标体的中心点,因而本片文章重点讲如何用传统图像处理方式来计算图像中目标体的中心。 方案 刚开始在考虑这个问题时其实也考虑了很多方法…

    数据库 2023年6月11日
    0117
  • Linux磁盘分区和挂载

    磁盘分区和挂载 挂载概念 在linux操作系统中,挂载是一个非常重要的功能,使用非常频繁。 它指将一个设备(通常是存储设备)挂接到一个已存在的目录上。需要理解的是,linux操作系…

    数据库 2023年6月16日
    084
  • dns服务之bind配置内网解析部分子域名,其它子域名转发

    bind配置内网解析部分子域名,其它子域名转发。以下以m.xxx.com和admin.xxx.com由内网dns解析,其它*.xxx.com转发给外网dns解析为例配置。文件/et…

    数据库 2023年6月14日
    0104
  • 从“把大象装进冰箱”来谈谈面向对象程序设计

    引子 把大象装进冰箱需要3步:打开冰箱门,把大象装入冰箱,关闭冰箱门。 扩展一下,我们考虑把动物装进冰箱的场景。比如,把猪🐷装进冰箱,把狗🐶装进冰箱,等等。 怎么利用面向对象的思想…

    数据库 2023年6月9日
    084
  • 16-ArrayList和LinkedList的区别

    1.1、作用 ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用。它们可以对元素的增删改查进行操作 对于ArrayList,它在集合的…

    数据库 2023年6月16日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球