SQL线程状态分析:processlist
时间:2022-07-25
本文章向大家介绍SQL线程状态分析:processlist,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文源自 公-众-号 IT老哥 的分享
IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章
老哥哔哔叨
我们已经写了很多 MySQL 的文章了,比如索引优化
、数据库锁
、主从复制
等等。今天在来和大家学习一个优化方法:show processlist
——查看当前所有数据库连接的 session
状态。帮助我们查看每个 SQL 线程的运行状态,是运行正常呀,还是 sleep 了,还是其他什么情况。
show processlist 简介
语法
不同用户之间只能查看自己的数据,如果想查看所有的请用管理员查询
show processlist;
返回结果字段说明
- id SQL 的 ID 标识,需要 kill 这个 SQL 进程的时候可以使用
- User 当前连接用户
- Host 所属的 IP 和端口
- db 数据库名
- command
连接状态,一般是
休眠
(sleep),查询
(query),连接
(connect),如果一条 SQL 语句是query
状态,而且time
时间很长,说明存在问题
- time 连接状态持续的时间,单位是秒(s)
- state(
重点分析
) 当前 SQL 语句的状态,是优化的重要参数 - info 显示当前所执行的 SQL 语句
state 详解
state 在优化中是很重要的字段,能提供给我们很多这条 SQL 线程的当前状态,帮助我们能定位分析问题。下面列举出 state 的一些常见的字段。
- state
解释
:代表资源未释放,如果通过连接池连接数据库,那么 state 应该是一个稳定的范围。如果有大量的 SQL 请求忘记关闭数据库连接,会造成大量连接请求阻塞,数据库挂掉。 - checking table
解释
:正在检查数据数据表,这个操作是系统自动的 - closing tables
解释
:表示正在将表中修改的数据刷新到磁盘中去,然后关闭用完的表,这是一个很快的操作。优化建议
:如果这个过程很慢,那就需要看看磁盘是否满了,或者磁盘在进行大量的 IO 操作等等 - connect out
解释
:主从复制里,从服务器正在连接主服务器 - creating tmp table
解释
:正在创建临时表,临时存放查询结果 - copying to tmp table on disk
解释
:当使用 order by、group by 或者 join 查询时,会出创建临时表的情况,当数据太大,会把内存中的临时表数据存储到硬盘上。优化建议
:一:优化索引,尽量减少创建临时表。二:优化 SQL 语句逻辑,可以用 Java 代码实现部分耗时的 SQL 逻辑。三:可以调节tmp_table_size
和max_heap_table_size
两个参数,增大内存中临时表的大小。 - flushing tables 在执行刷新表,等待其他线程关闭数据库表
- killed
解释
:发送了一个 kill 请求给某线程,那么这个线程将会检查 kill 标志位,同时会放弃下一个 kill 请求。MySQL 会在每次的主循环中检查 kill 标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么 kill 请求会在锁释放时马上生效。 - sending data
解释
:这个字段字面上很容易误导人,大部分人觉得他仅仅是发送数据给客户端,但其实是收集
+发送
。当 MySQL 使用索引查询完后,得到一堆行的 id,如果有的查询列不在索引中,那么 MySQL 需要到 id 所在的数据行,将数据取出来返回给客户端。 - sorting for group / order
解释
:SQL 语句中使用了 group 和 order 进行排序优化建议
:如果出现了创建临时表或者文件内排序的情况,比较耗时的情况下需要优化索引 - Waiting for net / reading from net / writing to net
解释
:主要是网络状态的描述,如大量出现,要检查数据库网络连接状态和流量优化建议
:比如外挂流量攻击数据库时,会导致网络带宽被占满,大量的连接请求打到数据库,造成数据库崩溃,建议进行防流量攻击。 - locked
解释
:SQL 被锁住了,如表锁,行锁,间隙锁等等。优化建议
:正确使用索引,避免索引失效升级为表锁。使用 innodb 搜索引擎,不要用 myisam。 - Opening tables
解释
:一个 SQL 线程正在尝试打开数据表,这个过程正常的情况是很快的,但是如果有人在 alter table,或者 lock table 语句之前完之前,其他线程无法打开这个数据表。 - Waiting for tables
解释
:该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。 以下几种情况下会产生这个通知:FLUSH TABLES tbl_name、 ALTER TABLE、 RENAME TABLE、 REPAIR TABLE、 ANALYZE TABLE、或 OPTIMIZE TABLE。 - System lock
解释
:正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务器同时请求同一个表,那么可以通过增加--skip-external-locking 参数来禁止外部系统锁。默认情况下这个参数是关闭的。
结语
大家可以根据state状态具体分析这个SQL语句,问题出现在哪里,结合老哥之前讲过的数据库锁,索引优化,show Profiles等等优化手段,进行综合分析,老哥只能告诉你们理论知识,把理论知识先学好,在实际工作中结合理论知识进行分析。
云服务器,云硬盘,数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF),大禹BGP高防(包含高防包及高防IP),云解析,SSL证书,手游安全MTP,移动应用安全、 云直播等等。
- 现代Web开发需要学习的15大技术
- 《剑指Offer》附加题_用两个队列实现一个栈_C++版
- MFC中的CListCtrl的最左边一列必须左对齐吗?
- 查找数组中重复的数字
- Lua学习笔记
- 使用Jpeglib
- 赋值运算符函数__from <剑指Offer>
- 从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用
- php实现SESSION跨域
- 使用cJSON解析JSON字符串
- 逻辑回归 | TensorFlow深度学习笔记
- MakeSureDirectoryPathExists与CreateDirectory的区别
- 粗略的物体碰撞预测及检测
- 讨厌算法的程序员 1 | 插入排序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ms SQL Server 如何导入数据库
- 移动直播连麦PK快速调试
- Python:使用爬虫获取中国最好的大学排名数据(爬虫入门)
- Python:酒鬼漫步
- apache-commons-dbutils + Druid + JDBC 简单实现 CRUD
- Python:将一个 csv 文件转为 json 文件存储到磁盘
- TKE上搭建集群Dashboard
- FFmpeg+OpenSLES 实现音频播放
- 使用 JSP+Servlet 模仿京东页面实现购物车功能
- Python 绘制科赫雪花的简单实现
- IP 数据报格式详解
- 地址解析协议 ARP 详解
- IP 地址分为哪几类?
- MySQL选错索引导致的线上慢查询事故
- 聊聊dubbo-go的kubernetesRegistry