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)

大家都在看

  • 2022-08-15 – 初识MySQL

    MySQL数据库 数据库 数据库,又称为Database,简称DB。数据库就是一个文件集合。顾名思义:是一个存储数据的仓库,实际上就是一堆文件,这些文件中存储了具有特定格式的数据,…

    数据库 2023年5月24日
    064
  • Tomcat8下的Redis会话共享

    前言: 最近在做网站的升级,从 Tomcat7升级到 Tomcat8版本,因为没接触过,就以为升级下Tomcat的版本就万事大吉,可是天不如人愿,很顺利的将应用升级到了Tomcat…

    数据库 2023年6月14日
    0100
  • MySQL中的触发器

    1.定义: 触发器和存储过程相似,都是嵌入到 MySQL 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。这些事件称为触发条件,…

    数据库 2023年6月16日
    0100
  • Mysql 数据恢复逻辑 基于binlog redolog undolog

    注:文中有个易混淆的地方”事务” sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,因为MVVC需要记录修改的事务id,…

    数据库 2023年6月16日
    089
  • 分割list,将集合按规定个数分为n个部分。

      /** * 按指定大小,分隔&#x9…

    数据库 2023年6月11日
    069
  • Spring Boot启动流程

    Spring Boot启动流程 君生我未生,君生我已老。君恨我生迟,我恨君生早。 一、简述 Spring Boot启动流程分析使用版本SpringBoot VERSION:版本 2…

    数据库 2023年6月14日
    089
  • SpringBoot邮件报警

    SpringBoot邮件报警 一、介绍 邮件报警,大体思路就是收集服务器发生的异常发送到邮箱,做到服务器出问题第一时间知道,当然要是不关注邮箱当我没说 (1)、引入依赖 <d…

    数据库 2023年6月6日
    0103
  • Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月6日
    077
  • Excel中VLOOKUP函数的用法

    一、VLOOKUP函数的作用 作用 :VLOOKUP函数可以帮助我们在已有的内容中快速匹配到我们想要的结果 二、VLOOKUP函数的参数及用法实例 VLOOKUP函数有四个参数:V…

    数据库 2023年6月11日
    073
  • 0812Java核心技术卷(1)随笔

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

    数据库 2023年6月14日
    091
  • MyBatis + SpringMVC 总结

    创建 MyBatis 的主配置文件(mybatis-config.xml):环境,事务管理,数据源 给类取别名 配置支持懒加载 创建接口以及接口的映射文件(UserMapper,U…

    数据库 2023年6月11日
    083
  • Docker Maven构建缓存spring boot依赖包

    背景 每次通过 docker build ‘xxx’ 的时候,总是会去maven镜像下载一大堆Jar包,平均每次build都要在3分钟左右,效率非常低下,于…

    数据库 2023年6月6日
    085
  • 慢SQL治理方法论

    @ 一、背景 二、发现 三、定位 四、分析 4.1 索引层面分析 4.2 业务层面分析 五、解决 5.1 SQL优化 5.1.1索引优化 5.1.2 子查询优化 5.1.3 分页优…

    数据库 2023年5月24日
    086
  • LeetCode 35. 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 …

    数据库 2023年6月11日
    059
  • Mysql查询优化

    mysq查询l优化 指标:执行时间 检查的行数 返回的行数 explain关键字 — 实际SQL,查找用户名为Jefabc的员工 select * from emp where …

    数据库 2023年5月24日
    099
  • 如何基于LSM-tree架构实现一写多读

    PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、海量存储、高性能、低成本的数据库服务。X-Engine…

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