【MySQL】聊聊MySQL常见的SQL语句阻塞场景

在平时的业务中,可能一个简单的SQL语句也执行很慢,这种情况其实大多数都是要么没有使用索引,要么出现锁竞争造成执行阻塞。本篇主要来介绍具体的场景

CREATE TABLE t (
id int(11) NOT NULL,
c int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

delimiter;
create procedure idata()
begin declare i int;
set i=1; while(i<=100000) do
insert into t values(i,i);
set i=i+1; end while; end;; delimiter;

call idata();

第一类:查询长时间不返回

在平时我们可能通过一个主键查询表 sql select * from t where id=1;,但是很久没有返回数据,这种一般都是表被锁住,没办法执行。可以使用 show processlist 进行查看。可能是如下三种情况,我们来一一分析。

等 MDL 锁

我本地使用的是8.0版本,没有办法直接复现。
在这里插入图片描述
Session A

mysql> lock table t write;
Query OK, 0 rows affected (0.00 sec)

Session B

mysql> select * from t where id = 1;

session A 使用lock对表T进行加了全局写锁,session B 通过获取id=1的记录,被阻塞。

解决方案

通过 mysql> show processlist; 可以看到在waiting for table metadata lock,但是没有获取谁占用锁资源。
通过查询 sys.schema_table_lock_waits 这张表,我们就可以直接找出造成阻塞的 process id,把这个连接用 kill 命令断开即可。

mysql> show processlist;

在这里插入图片描述

mysql> select blocking_pid from sys.schema_table_lock_waits;

在这里插入图片描述
可以发现kill 29会话之后,立马查询到数据。

mysql> kill 29;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where id = 1;
+----+---+
| id | c |
+----+---+
|  1 | 1 |
+----+---+
1 row in set (1418.40 sec)

等 flush

 Waiting for table flush

当出现这种提示,可以分析,当前执行的SQL在等待flush操作。如果要复现的话。
在这里插入图片描述

mysql> select sleep(1) from t; //等待
mysql> flush	tables t; //阻塞表t
mysql> select * from t where id = 1; //获取不到数据 

可以通过process list
在这里插入图片描述
发现由于id = 34的阻塞了整个执行流程,直接kill 就可以。

等行锁

当我们执行如下语句,要对ID=1的记录进行添加读锁。

select * from t where id=1 lock in share mode; 

在这里插入图片描述
session a 会对ID=1加写锁操作,就会造成sessionb的阻塞。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
 
mysql> update t set c = c + 1 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> 
mysql> select * from t where id = 1 lock in share mode;
1205 - Lock wait timeout exceeded; try restarting transaction
mysql> 

在这里插入图片描述
我使用的是8.0 版本,可以发现获取不到锁,超时失败。尝试重新获取事务。1205 - Lock wait timeout exceeded; try restarting transaction

第二类:查询慢

没有使用索引

select * from t where c=50000 limit 1;

在这里插入图片描述
可以发现,使用了全表扫描。虽然对于10W的数据量在0.02S内返回,但是坏查询不等于慢查询。当数据集过大时,非常影响系统性能。

大量undo log情况

在这里插入图片描述
在这里插入图片描述
为什么一个不使用lock in share mode的语句比一个有的还执行的慢。在于如果lock in share mode是当前读,也就是不会回溯 undo log。而seesion A是一致性读,一步步执行 undo log,然后读取最原始的值。
在这里插入图片描述

小结

读取不返回结果和查询慢两种不一样,前者是有共享资源被占用,要么行锁、表锁,被其他线程占用。而查询慢一般没有使用索引、或者一致性读的过程。所以我们需要多分析系统上可能存在的语句阻塞问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/691281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

17.调用游戏本身的hp减伤害函数实现秒杀游戏角色

上一个内容&#xff1a;16.在目标进程构建CALL执行代码 16.在目标进程构建CALL执行代码在它的代码上进行的更改&#xff0c;它的callData变量中的代码不完善一个完整的函数是有return的&#xff0c;处理器执行到return会返回如果执行不到会继续往下走&#xff0c;直到执行不下…

像素着色技术在AI绘画中的革新作用

摘要&#xff1a;随着人工智能技术的不断进步&#xff0c;AI绘画已成为艺术和技术领域中的一个热门话题。本文将探讨像素着色技术在AI绘画中的应用及其对创作过程的影响&#xff0c;揭示这一技术如何推动艺术创作的革新。 引言&#xff1a; 传统的绘画方法要求艺术家具备高超的…

Nextjs学习教程

一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

kafka的leader和follower

leader和follower kafka的leader和follower是相对于分区有意义的&#xff0c;不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中&#xff0c;并在leader挂掉后重新选举出leader。 kafka会再…

【Unity】 HTFramework框架(五十一)代码片段执行器

更新日期&#xff1a;2024年6月8日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Code Snippet Executer 代码片段执行器使用 Code Snippet Executer打开 Code Snippet Executer动态执行&#xff08;代码片段&#xff09;静态执行&#x…

从 Android 恢复已删除的备份录

本文介绍了几种在 Android 上恢复丢失和删除的短信的方法。这些方法都不能保证一定成功&#xff0c;但您可能能够恢复一些短信或其中存储的文件。 首先要尝试什么 首先&#xff0c;尝试保留数据。如果你刚刚删除了信息&#xff0c;请立即将手机置于飞行模式&#xff0c;方法是…

CSAPP Lab02——Bomb Lab完成思路详解

看见的看不见的 瞬间的永恒的 青草长啊大雪飘扬 ——月亮之上 完整代码见&#xff1a;CSAPP/bomb at main SnowLegend-star/CSAPP (github.com) 01 字符串比较 简单的把输入的字符串和地址“0x402400”内早已存储的字符串相比较。如果两个字符串相等则函数返回&#xff0c;否…

比亚迪正式签约国际皮划艇联合会和中国皮划艇协会,助推龙舟入奥新阶段

6月5日&#xff0c;比亚迪与国际皮划艇联合会、中国皮划艇协会在深圳共同签署合作协议&#xff0c;国际皮划艇联合会主席托马斯科涅茨科&#xff0c;国际皮划艇联合会秘书长理查德派蒂特&#xff0c;中国皮划艇协会秘书长张茵&#xff0c;比亚迪品牌及公关处总经理李云飞&#…

【计算视觉】学习计算机视觉你不得不膜拜的CVPR大神:何凯明

目录 第一章&#xff1a;CVPR——计算机视觉的终极擂台 第二章&#xff1a;何凯明——计算机视觉领域的耀眼星辰 第三章&#xff1a;高引用论文——计算机视觉研究的璀璨星辰 第四章&#xff1a;何凯明的CVPR论文——深度学习的探索之旅 第五章&#xff1a;结语——向何凯…

多样本上下文学习:开拓大模型的新领域

大模型&#xff08;LLMs&#xff09;在少量样本上下文学习&#xff08;ICL&#xff09;中展现出了卓越的能力&#xff0c;即通过在推理过程中提供少量输入输出示例来学习&#xff0c;而无需更新权重。随着上下文窗口的扩展&#xff0c;我们现在可以探索包含数百甚至数千个示例的…

线性表和链表

一&#xff0c;线性结构 1.Array Array文档&#xff1a;可以自行阅读相关文档来了解Array class array.array(typecode[, initializer]) array.append(x)&#xff1a;添加元素到数组末尾 array.count(x)&#xff1a;计算元素出现次数 array.extend(iterable)&#xff1a;将迭代…

数据库(27)——多表查询——自连接

语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 自连接可以是内连接查询也可以是外连接查询。 演示 我新增了字段friend便于演示 查询所有人的名字以及他们的friend的人的名字&#xff1a; select a.name,b.name from user a,user b where a.friendb.id; 其…

LeetCode72编辑距离

题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组&#xff0c;尺寸和这两个字符串的长度相等&#xff0c;用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的&#xff0c;只不过相比1143的一种方式&#xff0c;变成了三种方式&#xff0c;就…

构建数字社会:Web3时代的社会治理与价值重构

随着数字化技术的飞速发展&#xff0c;我们正逐渐迈入Web3时代&#xff0c;这是一个以去中心化、开放性和透明性为特征的新时代。在这个时代&#xff0c;数字技术将不仅仅改变我们的生活方式和商业模式&#xff0c;还将对社会治理和价值观念产生深远影响。本文将探讨Web3时代下…

今天是放假带娃的一天

端午节放假第一天 早上5点半宝宝就咔咔乱叫了&#xff0c;几乎每天都这个点醒&#xff0c;准时的很&#xff0c;估计他是个勤奋的娃吧&#xff0c;要早起锻炼婴语&#xff0c;哈哈 醒来后做饭、洗锅、洗宝宝的衣服、给他吃D3&#xff0c;喂200ml奶粉、给他洗澡、哄睡&#xff0…

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)

上期链接&#xff1a;Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算&#xff0c;我们先给人物和野猪挂上属性和攻击属性的代码&#xff0c;然后通过触发器触发受伤的事件。物体&#xff08;人物也好敌人也行&#xff…

信息系统项目管理师0148:输出(9项目范围管理—9.3规划范围管理—9.3.3输出)

点击查看专栏目录 文章目录 9.3.3 输出 9.3.3 输出 范围管理计划 范围管理计划是项目管理计划的组成部分&#xff0c;描述将如何定义、制定、监督、控制和确认项 目范围。范围管理计划用于指导如下过程和相关工作&#xff1a; ①制定项目范围说明书&#xff1b;②根据详细项目范…

【树莓派内核版本降级】笔记

【树莓派内核版本降级】笔记 文章目录 【树莓派内核版本降级】笔记一、起因二、降级流程1.降级失败经验&#xff08;使用一体化的降级命令&#xff09;2.手动下载固件&#xff08;降级成功&#xff09; 一、起因 我在学习树莓派内核开发以及驱动开发的时候&#xff0c;树莓派在…

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

文章目录 map组件基础使用封装map.js&#xff0c;实现定位1、使用第三方地图&#xff1a;高德&#xff0c;申请对应平台key1、申请H5 key2、申请微信小程序 key3、申请android key查看证书详情&#xff0c;可以看到SHA1查看/设置Android包名 4、申请ios key 2、封装map1、lib/m…

例54:Draw使用

建立一个控制台工程&#xff0c;输入代码&#xff1a; Screen 13 移动到&#xff08;50,50&#xff09;而不绘图 Draw "BM 50,50" B:移动但不绘制,M:移动到指定位置 将绘图颜色设置为2&#xff08;绿色&#xff09; Draw "C2" C将颜色改为n …