学习是一个逐步发现自己无知的过程!

Mysql PROCESSLIST结果详解

常用语句

state不为空的状态

SELECT * FROM information_schema.PROCESSLIST WHERE STATE  != ''

按照执行时间排序

SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'sleep' ORDER BY TIME DESC 

STATE常见状态

官方文档https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

Sending data

线程正在读取和处理SELECT语句的行 ,并将数据发送到客户端
由于在此状态期间发生的操作往往会执行大量磁盘访问(读取),因此它通常是给定查询生命周期中运行时间最长的状态

这是最常见的状态,也是最模糊的状态。
这个状态并不是字面理解的“发送数据”,在读取数据开始、到数据发到客户端之前,都可能是这个状态。如果在这个状态持续的时间比较久,需要拿到processlist.info,通过explain进一步定位问题。常见的问题有下面几种:

  • 索引不理想、导致回表较多,磁盘压力大、一直在等待磁盘读完数据;可通过explain的rows看到特征
  • 文件排序等待,特征是cpu会变高;可通过explain的extra看到特征

closing tables

该线程正在将更改的表数据刷新到磁盘并关闭已使用的表。这应该是一个快速的操作。如果没有,请验证您没有完整磁盘并且磁盘使用不是很大.
磁盘不足的重要状态。

Copying to tmp table on disk

服务器正在复制到磁盘上的临时表。临时结果集变得太大(“MySQL中的内部临时表使用”,超过tmp_table_size)。因此,线程正在将临时表从内存更改为基于磁盘的格式以节省内存。

配置的临时表空间不足时,临时表会从内存写入磁盘,这个动作比较耗时。

相关的状态还有Creating tmp table: 该线程正在内存或磁盘上创建临时表。如果表在内存中创建但稍后转换为磁盘表,则该操作期间的状态将为Copying to tmp table on disk

Updating

线程正在搜索要更新的行并正在更新它们.
一般情况下update因为有主键约束会很快,但有一种情况发生时,会导致update等待严重: 有一个update语句没有走上唯一索引,进行了索引扫描,扫描时索引行是被锁住的,其他更新只能等待

Writing to net

服务器正在将数据包写入网络.
注意数据库服务器的网络吞吐量是否超限或网络环境较差,或者是否返回的数据太多了

Waiting for table lock

该线程正在等待一个表格锁

Sending data

该线程正在将数据发送到客户端

COMMAND常见状态

官方文档https://dev.mysql.com/doc/refman/5.7/en/thread-commands.html

Sleep

该线程处于空闲状态,等待新的请求

Query

该线程正在执行查询语句

Connect

该线程正在建立一个新的连接

Init DB

该线程正在初始化一个新的数据库连接

Field List

该线程正在获取一个表格的列信息

Statistics

该线程正在收集性能统计信息

Prepare

该线程正在准备一个SQL语句

Execute

该线程正在执行一个SQL语句

Binlog Dump

该线程正在处理二进制日志

Table Dump

该线程正在处理数据表的复制常见的

赞(0)
未经允许不得转载:劉大帥 » Mysql PROCESSLIST结果详解

你的评论可能会一针见血! 抢沙发

登录

找回密码

注册