首页 > 其他分享 > 19 | 为什么我只查一行的语句,也执行这么慢?

19 | 为什么我只查一行的语句,也执行这么慢?

时间:2023-07-06 21:44:43浏览次数:28  
标签:语句 19 lock 线程 flush 只查 id select

以下内容出自 《MySQL 实战 45 讲》

19 | 为什么我只查一行的语句,也执行这么慢?

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

mysql> select * from t where id=1;

一般碰到这种情况。大概率是表 t 被锁住了。

分析:

首先执行 show processlist 命令,查看当前语句的状态。

  • 等 MDL 锁

image

如上图,出现了 Waiting for table metadata lock, 这表示现在有一个线程正在表 t 上请求或者持有 MDL 写锁,把 select 语句堵住了。

这类问题的处理方式,就是找到谁持有 MDL 写锁,然后把它 kill 掉。

通过查询 sys.schema_table_lock_waits 这张表,就可以直接找出造成阻塞的 process id,把这个连接用 kill 命令断开即可。

image

  • 等 flush
    image

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

flush tables t with read lock;
flush tables with read lock;

正常这两个语句执行起来都很快,除非它们也被别的线程堵住了。

出现 Waiting for table flush 状态的可能情况是:有一个 flush tables 命令被别的语句堵住了,然后它又堵住了.select 语句。

这种处理方式和上一种一样。

  • 等行锁
mysql> select * from t where id=1 lock in share mode; 

于访问 id=1 这个记录时要加读锁,如果这时候已经有一个事务在这行记录上持有一个写锁, select 语句就会被堵住。查询谁占用着写锁,可以用下面的语句,查询表 sys.innodb_lock_waits

mysql> select * from t sys.innodb_lock_waits where locked_table='`test`.`t`'\G

在这里插入图片描述

4 号线程是造成堵塞的罪魁祸首。 而干掉这个罪魁祸首的方式,就是 KILL QUERY 4 或 KILL 4。

  • KILL QUERY 4:表示停止 4 号线程当前正在执行的语句,而这个方法其实是没有用的。因为占有行锁的是 update 语句。
  • KILL 4:表示直接断开这个连接。连接被断开时,会自动回滚这个连接里面正在执行的线程,同时也就释放了 id = 1 上的行锁。

第二类 查询慢

  • 字段没有索引,走了全表扫描。
  • 当前事务查询的数据被别的事务大量修改,导致一致性读要依次执行 undo log, 才能返回一致性是视图结果。

标签:语句,19,lock,线程,flush,只查,id,select
From: https://www.cnblogs.com/sun-yanglu/p/17533412.html

相关文章

  • DQL语句
    DQL语句DQL数据库查询语言查询关键字:SELECTDQL基本查询查询指定字段name,workno,gae返回selectname,workno,agefromemp;查询所有字段并且返回select*fromemp;或者selectid,workno,name,gender,age,idcard,workaddress,entrydatefromemp;......
  • SQL--DML语句
    SQL--DML语句DML介绍用来对数据库中的表的数据记录进行增删改查操作.添加数据修改数据删除数据DML添加数据插入数据时,指定的字段顺序需要与值的顺序是一一对应的.字符串和日期型数据应该包括在引号中.插入的数据大小,应该在字段的规定范围内.DML修改......
  • ubuntu系统安装jdk报错debianutils : Breaks: x11-common (< 1:7.7+23~) but 1:7.7+19
    问题:Ubuntu系统执行aptinstallopenjdk-8-jdk 安装jdk8报错root@2b6d781ebc36:/#aptinstallopenjdk-8-jdkReadingpackagelists...DoneBuildingdependencytree...DoneReadingstateinformation...DoneSomepackagescouldnotbeinstalled.Thismaymeanthatyo......
  • Zabbix“专家坐诊”第198期问答汇总
    问题一 Q:请问一下,自带的思科SNMP交换机模板,怎么不监控down的接口?A1:这种一般在自动发现规则里加个过滤器,过滤出IFSTATUS匹配(1|3)的就能实现只发现up的端口了。A2:1. 在“Items”页面,找到“Interface status”监控项,打开“Latest data”选项。2.在监控项的“Preprocessing......
  • 循环语句 + else
    说明除了if可以跟else搭配使用,while、for也可以与else搭配使用,表示循环正常结束,后执行else语句。 while-else语法1while条件:2#循环体3#在这里执行需要重复的操作4else:5#循环条件为False时执行的代码在这个语法中:条件 是一个布尔表达式......
  • 循环语句for循环
    语法1for变量in可迭代对象:2#循环体3#在这里执行需要重复的操作在这个语法中:变量 是用于表示可迭代对象中的每个元素的临时变量名。在每次迭代时,变量将被赋值为可迭代对象的下一个元素。可迭代对象可以是列表、元组、字符串、字典或其他任何可迭代的数......
  • 循环语句-while-练习题
    1'''2练习while循环3其实就是练习手感,不停的敲4'''56'''71.打印星号(三⻆形)8*9**10***11****12*****13找规律,弄懂需求:5行5列,只显示了column<=row。显示的内容是*14解决:2个循环搞定15'''1617row=118whi......
  • Visual Studio2019 BackgoroundImageLayout属性
    ​BackgroundImageLayout属性值背景图片重复:BackgroundImageLayout属性设置为Tile(默认)背景图片左边显示:BackgroundImageLayout属性设置为None背景图片右边显示:BackgroundImageLayout属性设置为None,同时RightToLeft属性设置为Yes背景图片居中显示:BackgroundImageLayout属性设......
  • python条件判断语句
    if条件判断语句if条件:(缩进)语句块一语句块二python的条件判断语句是没有括号的,对于所匹配的代码块的精准定位是通过缩进实现的,这是python的一大特色。、if条件:   语句块一else:   语句块二如果还有更多条件的话可以引入elifif条件:   语句块一e......
  • 19-知识图谱在反欺诈中的应用
    19.知识图谱在反欺诈中的应用知识图谱的应用价值19.1知识图谱的应用(1)对多源异构数据和多维复杂关系的处理与可视化展示:将人类社会生活与生产活动中难以用数学模型直接表示的关联属性,利用语义网络和专业领域知识进行组织存储,形成一张以关系为纽带的数据网络,通过对关系的挖掘与......