命令
show processlist
,查看正在运行的线程,列出前 100 条show full processlist
,列出所有正在运行的线程
解析
1 | mysql> show processlist; |
- Id:线程标识,
kill
某线程时使用 - User:显示当前用户,也就是执行
SQL
语句的用户 - Host:显示执行
SQL
的IP
和端口,可以用来追踪问题的来源 - db:显示该线程连接的是哪个数据库
- Command:显示当前执行的命令,一般:
Sleep
休眠,Query
查询,Connect
连接,Binlog Dump
复制 - Time:会话持续时间,单位(秒)
- State:显示使用当前连接的状态,很重要列。请注意,
State
只是语句执行中的某一个状态,以查询为例,需要经过copying to tmp table,sorting result,sending data
等状态才算完成。 - Info:显示执行的
SQL
语句,判断问题的重要依据。
State
- Sleeping:已处理完,正在等待客户端发送新请求。
- Sending data:线程正在处理
select
语句,并将数据发送到客户端。由于在此状态期间发生的操作往往会执行大量磁盘访问(读取),因此它通常是给定查询生命周期中运行时间最长的状态,属于慢查询。 - Creating tmp table:正在创建临时表以存放部分查询结果。
- Copying to tmp table on disk:由于临时结果集大于
tmp_table_size
,正在将临时表从内存存储转为磁盘存储以此节省内存,可以通过变量tmp_table_size
和max_heap_table_size
来控制内存表大小上限。 - Waiting for table flush:线程正在执行
flush tables
并且正在等待所有线程关闭它们的表。但是,要重新打开表,它必须等到所有其他线程关闭了相关表。 - Writing to net:服务器正在将数据包写入网络。
- Killed:通常发送了一个 kill 请求给某线程,某些情况下,线程可能仍然需要很短的时间才能死掉,如果线程被某个其他线程锁定,则一旦另一个线程释放其锁定,kill 就会马上生效。
- System lock:正在等待取得一个外部的系统锁。如果当前没有运行多个
mysqld
服务同时请求同一个表,那么可以通过增加--skip-external-locking
参数来禁止外部系统锁。