MySQL45讲之查询慢或者阻塞 – flowers「终于解决」

MySQL45讲之查询慢或者阻塞 – flowers「终于解决」本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。

MySQL45讲之查询慢或者阻塞 - flowers

前言

本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。

锁表

1. 等MDL锁

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

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

等待MDL锁

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

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

解决办法:

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

查询MDL阻塞pid

2. 等待flush

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

# 关闭表 t
flush tables t with read lock;

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

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

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

等flush

3. 等行锁

行锁阻塞模拟

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

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

行锁阻塞processlist状态

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

解决办法:

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

查询行锁阻塞状态

执行慢

执行慢模拟例子

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 后,在另一个事务对全表任何一行的更新操作都需要等待,在全表任何位置的插入操作也需要等待。

参考

  • [1] 为什么我只查一行的语句,也执行这么慢

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5837.html

(0)
上一篇 2023-04-22
下一篇 2023-04-22

相关推荐

  • 极致效率,云原生数据库TDSQL-C安身立命的根本「建议收藏」

    极致效率,云原生数据库TDSQL-C安身立命的根本「建议收藏」云原生时代需要什么样的数据库?如何构建数据库服务?腾讯云数据库技术负责人程彬认为,云数据库未来趋势会从以托管为核心升级到以极致效率为核心,助力业务降本增效。从数据库管理和应用角度来看,云厂商、资源、客

    2023-05-23
    183
  • 简单理解分表分库及其缺点[亲测有效]

    简单理解分表分库及其缺点[亲测有效]当我们系统达到瓶颈时候,最影响系统性能的永远是最底层的。例如数据库,所以数据库优化相对重要,当数据库性能由于数据量过大导致达到瓶颈的时候,我们会选择对数据库拆分或者对表拆分,也就是分表分库。分表分库…

    2023-04-13
    155
  • 1. select语句执行过程-网络通信

    1. select语句执行过程-网络通信执行过程图 网络通信 MySQL 是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。 1.同步/异步 异步的问题 异步可以避免应用阻塞等待,但是不能节省 SQL 执行的时间。 如果…

    2023-03-25
    151
  • theoracle_oracle基础教程

    theoracle_oracle基础教程1 Oracle的服务 Oracle的监听服务:OralceOraDB12Home1TNSListener 需要通过程序链接数据库进行开发的时候,此服务必须打开,如果只是在本机使用,此服务可不启动 O

    2023-04-19
    132
  • Python程序员: 用代码实现你想要的功能

    Python程序员: 用代码实现你想要的功能随着互联网的发展,代码已经渐渐成为了一个人在信息时代中的必备技能之一。而Python作为一种简单易学、功能丰富的编程语言,已经成为了各行各业中广泛使用的工具。Python程序员可以用代码实现各种各样的功能:爬取网页数据、解析数据、制作数据可视化图表等等。Python程序员可以做的事情多种多样,本文将介绍几个常见的方面。

    2024-02-11
    99
  • MongoDB-备份恢复「建议收藏」

    MongoDB-备份恢复「建议收藏」
    备份工具 (1)** mongoexport/mongoimport (2)***** mongodump/mongorestore 备份工具区别在那里? …

    2023-04-09
    148
  • Binlog分析利器-binlog_summary.py[亲测有效]

    Binlog分析利器-binlog_summary.py[亲测有效]如何基于Binlog得到事务的大小、事务的持续时间、热点表?

    2023-04-20
    163
  • HMS核心服务让应用更智慧

    HMS核心服务让应用更智慧     华为新款旗舰机P40系列全面搭载HMS核心服务为用户带来更智能的应用。作为P40的用户,我想和大家分享一下硬核的HMS核心服务,它为华为P40系列手机用户提供多项基础服务,而HMS核心服务…

    2023-02-21
    155

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注