MySQL~「show PROCESSLIST」

SHOW PROCESSLIST命令可以查看当前MySQL Server上运行的线程。

SHOW STATUS命令不同,SHOW PROCESSLIST命令是有权限分别的。有PROCESS 权限的用户,可以看到所有线程状态,否则,只能看到当前用户所创建的线程状态。

完整的语法结构如下所示

SHOW [FULL] PROCESSLIST
要注意加不加FULL的区别,不加FULL并不是只获取前100行,而是显示INFO字段的前100个字符,而INFO字段的内容就是该线程正在执行的Statement(包括但不限于SQL语句)。

在阿里云的RDS上,加不加FULL关键字,得到的结果还有一个明显的差别,就是加了FULL关键字后,会多出若干列,比如Memory_used,Logical_read等资源消耗指标。

8个字段解释

  1. Id,线程标识(ID)。

  2. User,打开线程的用户,或者是线程的Owner。

  3. Host,客户端连接地址,表示的是连接MySQL Server的客户端上的TCP套接字。

  4. db,线程所连接的数据库名称。

  5. Command,表示线程正在执行的命令,可能的值多达30多种,下面列举几个命令作为重点了解:

命令 描述
Binlog Dump 在MySQL主从结构中,此命令表示Master节点正在发送binlog给Slave节点,实际上是一个数据同步的过程。
Connect/Connect Out 前者是Slave节点已经连接上了对应的Master节点,后者则表示正在连接中的状态。
Close stmt 相当于是statement.close(),意思是关闭一个statement句柄
Execute 正在执行statement预编译。前期的预编译是对SQL语法的检查,形成MySQL内部可执行的形式,能提高后续SQL语句的执行效率。
Fetch/Long Data 都是获取Execute的结果,但是后者是专门针对一大串数据获取的状态。
Query 真正是在执行statement。
Create DB/Drop DB 正在执行create database/drop database操作。
Shutdown 该线程正要关闭MySQL Server。
Sleep 等待客户端发送新的statement过来,大部分线程是处于此状态的。将Time结合起来,可以发现一个线程空闲了多长时间。
  1. State,表示Statement执行中的某一个瞬时状态。状态的切换都是非常迅速的,如果长期停滞在某个状态,则极有可能存在问题。MySQL对线程的状态管理非常细致,多达70多种,下面列举几种状态作为重点了解:
状态 描述
creating table/altering table/Checking table/Opening tables/closing tables 这一组是有关于表操作的,涉及了表的创建,修改,检查,开启和关闭。
Killed 线程接收到了kill命令,当下个轮回检查kill标识位的时候,该线程将会被终止。如果线程是在被锁住的过程中接收到了kill命令,那么一旦锁被释放了,线程就立马被终止了。
executing 线程正在执行Statement。
logging slow query 正在记录一个慢查询语句。
NULL 只有SHOW PROCESSLIST命令才能出现的状态。
optimizing 准备要进入查询语句的优化阶段了。
preparing 正处于查询语句的优化阶段。
Reading from net MySQL Server正在读取网络报文。
Writing to net MySQL Server正在写入网络报文。
removing tmp table 正在移除SELECT语句产生的内部临时表,通常是在JOIN的时候产生的中间表。
Rolling back 正在进行事务回滚。
Sending data 把SELECT语句的执行结果发送给客户端,这个状态存在的时间是最长的,因为涉及到了磁盘的读取访问。因此,缩短这个状态持续的时间是非常必要的,比如,尽量少产生临时表,避免filesort等。
Sorting for group 正在为GROUP BY做排序。
Sorting for order 正在为ORDER BY做排序。
update/Updating 前者表示准备要进行更新操作了,后者表示寻找要更新的记录,进而更新之。
Waiting for tables 数据表结构一旦发生了变化,线程会接受到通知,需要重新获取最新的数据结构,也就会触发重新打开表(reopen table)的操作。但是这个操作可能不会立马得到执行,因为其他线程执行的某些操作会将表锁住,这个状态就表示正在等待锁释放,以重新获取数据表结构。
Waiting for xxxx lock 等待获取锁,xxxx 表示锁的类型。
  1. Time,在该state状态下所持续的时间。

  2. Info,线程当前所执行的Statement,NULL表示未执行任何语句。

你可能感兴趣的:(MySQL~「show PROCESSLIST」)