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个字段解释
-
Id,线程标识(ID)。
-
User,打开线程的用户,或者是线程的Owner。
-
Host,客户端连接地址,表示的是连接MySQL Server的客户端上的TCP套接字。
-
db,线程所连接的数据库名称。
-
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结合起来,可以发现一个线程空闲了多长时间。 |
- 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 表示锁的类型。 |
-
Time,在该state状态下所持续的时间。
-
Info,线程当前所执行的Statement,NULL表示未执行任何语句。
网友评论