代码改变世界

MySQL -- show processlist

2017-11-07 12:47  abce  阅读(542)  评论(0编辑  收藏  举报
mysql> show full processlist
或者
mysql> show processlist;
+---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+
| Id      | User      | Host              | db       | Command     | Time    | State                  | Info                                  |
+---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+
| 3672856 | abce      | 192.168.5.1:38311 | abce     | Query       |       0 | Sending data           | select count(1) from (select          
+---------+-----------+-------------------+----------+-------------+---------+------------------------+---------------------------------------+

说明:

ID:
	id标识。kill用户的时候有用
User:
	当前连接的用户
Host:
	当前用户连接是从哪个ip和port连接过来的
db:
	数据库名
Command:
	连接状态,一般是休眠(sleep),查询(query),连接(connect)
Time:
	连接持续的时间,单位是秒
State:
	当前sql语句的状态
Info:
	sql语句内容

 

其中state的状态十分关键,下表列出state主要状态和描述: 

状态 说明 建议
After create

当线程创建一个表(包括临时表),创建函数结束时的状态。
即使因为某些原因创建失败,也会显示。

 
Analyzing 线程正在估算myisam表的键的分布  
checking permissions 权限检查  
Checking table 检查表  
cleaning up 命令结束,准备释放内存和重置状态变量  
closing tables

刷新表数据到磁盘并关闭表。
这个状态一般比较快,否则就该查看一下磁盘的使用了

 
converting HEAP to MyISAM 将内部内存临时表转成成磁盘上的myisam表  
copy to tmp table

线程在执行alter table命令。
发生在表结构已经修改,但是数据还没有拷贝回去

建议:凌晨执行
altering table 原地执行alter table命令  
Copying to tmp table 从内存将数据拷贝到临时表 建议:创建索引
Copying to group table 如果语句的order by和group by列不同,行被分组排序并拷贝到临时表  
Copying to tmp table on disk

拷贝到磁盘上的临时表。
临时结果集太大,因为线程要将内存中的数据拷贝到磁盘上以便节省内存。

建议:创建索引,加大tmp_table_size/max_heap_table_size
Creating index 正在对myisam表执行alter table … enable keys  
Creating sort index 使用内部临时表执行select操作 建议:创建索引
creating table 创建表(包含临时表)  
Creating tmp table

现在内存或磁盘上创建临时表。
如果是先创建内存中的临时表然后转换到磁盘上,显示的状态是Copying to tmp table on disk

建议:创建索引
committing alter table to storage engine 原理alter table结束,提交结果  
deleting from main table

在执行多表删除的第一部分。
只是从第一个表中删除,会保存列和偏移量用于删除其他表

 
deleting from reference tables 多表删除的第二部分,从其他表删除匹配的行  
discard_or_import_tablespace 线程在处理alter table … discard tablespace或alter table … import tablespace  
freeing items 线程已经执行完一个命令。释放一些items  
FULLTEXT initialization 准备执行全完检索  
Removing duplicates 查询使用了distinct  
removing tmp table 移除内部临时表  
Reading from net server端正通过网络读取客户端发送过来的请求 建议:减小客户端发送数据包大小,提高网络带宽/质量
Sending data 从server端发送数据到客户端,也有可能是接收存储引擎层返回的数据,再发送给客户端,数据量很大时尤其经常能看见 建议:通过索引或LIMIT,减少需要扫描的数据量
Sorting result 正在对结果进行排序,类似Creating sort index,不过是正常表,而不是在内存表中进行排序 建议:创建索引
Statistics 进行数据统计以便解析执行计划,如果状态比较经常出现,有可能是磁盘IO性能很差 建议:查看当前io性能状态,例如iowait
System lock 正在等待系统级锁 建议:关闭外部锁skip-external-locking(已经默认关闭了)
Waiting for global read lock 通常是FLUSH TABLES WITH READ LOCK整等待全局读锁  

Waiting for tables,
或Waiting for table flush

通常是因为FLUSH TABLES, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE等需要刷新表结构并重新打开