《MySQL——查询长时间不返回的三种原因与查询慢的原因》
目录
- 查询长时间不返回
- 等MDL锁
- 等flush
- 等行锁
- 查询慢
构造一张表,表有两个字段id和c,再里面插入了10万行记录
create table 't' ('id' int(11) not null,'c' int(11) default null,primary key ('id')
) engine = InnoDB;delimiter ;;
create procedure idata()
begindeclare i int;set i = 1;while( i <= 100000) doinsert into t values(i,i);set i = i+1;end while;
end;;
delimiter ;call idata();
查询长时间不返回
在表t执行:
select * from t where id = 1;
查询结果长时间不返回。
等MDL锁
大概率是表t被锁住了,接下来分析原因:一般都是首先执行show processlist命令,看看当前语句处于什么状态。
表示现在有个线程正在表t上请求或者持有MDL写锁,把select语句阻塞了:
session A通过lock table命令持有表t的MDL写锁,而sessionB 的查询需要获取MDL读锁,所以session B 进入等待状态。
处理方式:找到谁持有MDL写锁,然后把它kill掉。
通过
select blocking_pid from sys.schema_table_lock_waits;
得到blocking_pid = 4;
然后用kill命令断开即可。
等flush
在表t上执行下面语句:
select * from information_schema.processlist where id=1;
可以查看出该线程的状态是Waiting for table flush;
表示现在有一个线程正要对表t做flush操作。
flush tables t with read lock; --只关闭表t
--or
flush tables with read lock; --关闭MySQL里面所有打开的表
正常来说,这两个语句执行起来都很快,除非它们也被别的线程堵住了。
所以可能是:有一个flush tables
命令被别的语句堵住了,然后它又堵住了我们的select语句。
下图是执行结果:
等行锁
select * from t where id = 1 lock in share mode;
由于访问id = 1这个记录时要加读锁,如果这时候已经有一个事务在这行记录上持有一个写锁,我们的select语句就会被堵住,如下:
session A启动事务,占用写锁,但是不提交,导致session B被堵住。
可以通过:
mysql> select * from t sys.innodb_lock_waits where locked_table='`test`.`t`'\G
进行查询,查出是谁占着这个写锁
发现是4号线程,然后我们kill 4
查询慢
select * from t where c = 50000 limit 1;
由于字段c上没有索引,所以这个语句只能走id主键顺序扫描,因此需要扫描5万行。
扫描行数多,所以执行慢,这个很好理解。
而下面的这条语句扫描行数为1,但是执行时间取却较长
select * from t where id = 1;
在这个场景下,session A先启动了一个事务,之后session B才开始执行update语句。
session B 更新完 100 万次,生成了 100 万个回滚日志 (undo log)
带lock in share mode 的sql是当前读,因此会直接读到 1000001 ,所以速度很快。
select * from t where id = 1语句是一致性读,因此需要从 1000001 开始,依次执行undo log,执行100万次后,才将1返回
**回滚日志过大引起的一致性读慢,当前读快 **
《MySQL——查询长时间不返回的三种原因与查询慢的原因》相关推荐
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛之初赛 第1轮 讲解(01-08课)
信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...
- 信息学奥赛一本通习题答案(五)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通习题答案(三)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通题目代码(非题库)
为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...
- 信息学奥赛一本通(C++版) 刷题 记录
总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
最新文章
- 成为MySQL DBA 博客系列-数据库升级
- Luence初始与简单应用-Document的增删改查.
- JPA的泛型DAO设计及使用
- java getselectedrow_Java swing(2)自己设计完善的独特功能图书管理系统,获取下拉框等的文字内容等...
- Windows server 2008 r2企业版安装步骤
- win8计算机安全模式,安全模式,详细教您Win8怎么进入安全模式
- 登录不上_《盗贼之海》登录不上?还在傻傻等待,快来让我教教你
- 二逼了吧,你竟然在中断里面休眠
- dockerfile如何运行镜像内的脚本_第七章 Dockerfile文件解析(一)
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
- 【学习笔记】从eXeScope到汇编与反汇编、加壳与脱壳的理解
- 数据结构课程设计——学生成绩查询与分析系统(简单详细版,含讲解)
- 编写USB鼠标驱动程序,并测试
- 南丁格尔玫瑰图的Python
- [ExtJS] Tpl模板中的extjs控件无法失焦处理
- 服务器hz和显示器hz,揭秘精神论:玩电竞是否必须144Hz显示器
- 2021年HECTF部分Writeup
- 客户端在线更新-QT
- Unity3d 实现节奏空间(Beat Saber)模型切割功能项目工程源码。
- 时辰和属相、当令经的对应关系