MySQL性能分析(四)之processlist详解
一、概述
processlist是MySQL数据库的实时连接监控中心,通过它可直观查看当前所有数据库连接线程的状态(如执行SQL、空闲、锁等待等),是排查慢查询、死锁、连接泄露等性能问题的核心手段。
关键版本变更(必看!)
- 弃用警告:
information_schema.processlist表及对应的show processlist命令,在MySQL 8.0+版本已标记为弃用,未来将彻底移除; - 替代方案:推荐使用
performance_schema.processlist(功能兼容,新增关键字段); - 结构差异:两者字段基本一致,
8.0+版本的performance_schema表新增execution_engine(执行引擎)字段,支持区分primary(InnoDB)和secondary(HeatWave)引擎。
二、命令详解
通过processlist表,可以查看当前服务器正在执行的线程信息。
mysql> select * from performance_schema.processlist\G;
*************************** 1. row ***************************
ID: 5
USER: event_scheduler
HOST: localhost
DB: NULL
COMMAND: Daemon
TIME: 21411
STATE: Waiting on empty queue
INFO: NULL
EXECUTION_ENGINE: PRIMARY
*************************** 2. row ***************************
ID: 714
USER: root
HOST: localhost
DB: performance_schema
COMMAND: Query
TIME: 0
STATE: executing
INFO: select * from performance_schema.processlist
EXECUTION_ENGINE: PRIMARY
2 rows in set (0.00 sec)
三、表结构与字段说明
表结构:
mysql> desc processlist;
+------------------+-----------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-----------------------------+------+-----+---------+-------+
| ID | bigint unsigned | NO | PRI | NULL | |
| USER | varchar(32) | YES | | NULL | |
| HOST | varchar(261) | YES | | NULL | |
| DB | varchar(64) | YES | | NULL | |
| COMMAND | varchar(16) | YES | | NULL | |
| TIME | bigint | YES | | NULL | |
| STATE | varchar(64) | YES | | NULL | |
| INFO | longtext | YES | | NULL | |
| EXECUTION_ENGINE | enum('PRIMARY','SECONDARY') | YES | | NULL | |
+------------------+-----------------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
- ID:连接标识符。这是在
show processlist语句的id列中显示的相同值,显示在Performance Schema线程表的processlist_id列中,并在线程内通过connection_id()函数返回的值相同。 - USER:发出该语句的
MySQL用户。system user的值指的是由服务器生成的非客户端线程,用于在内部处理任务,例如延迟行处理线程或在复制主机上用于处理I/O或SQL的线程。对于system user,Host列中没有指定主机。unauthenticated user指的是已与客户端连接关联但尚未对客户端用户进行身份验证的线程。event_scheduler指的是监视预定事件的线程。 - HOST:发出该语句的客户端的主机名(对于
system user则没有主机)。对于TCP/IP连接,主机名以host:port(主机地址:端口)的格式显示,以便更容易确定哪个客户端在执行什么操作。 - DB:线程的默认数据库,如果未选择任何数据库,则为
NULL。 - COMMAND:线程代表客户端执行的命令类型,如果会话处于空闲状态,则为
Sleep。此列的值对应于客户端/服务器协议的COM_xxx命令和Com_xxx状态变量。 - TIME:线程在当前状态下已经经过的时间,以秒为单位。对于复制
SQL线程,该值是上一个复制事件的时间戳与复制主机的实际时间之间的秒数。 - STATE:一个动作、事件或状态,表示线程正在进行的操作。大多数状态对应非常快速的操作。如果一个线程在特定状态停留了很多秒,可能存在需要调查的问题。
- INFO:线程正在执行的语句,如果没有执行语句则为
NULL。该语句可以是发送给服务器的语句,或者如果该语句执行其他语句,则为最内层的语句。 - EXECUTION_ENGINE:查询执行引擎。该值可以是
primary或secondary。在MySQL HeatWave Service和HeatWave中使用,其中primary引擎是InnoDB,而secondary引擎是HeatWave(RAPID)。对于社区版本、企业版(本地部署)以及没有HeatWave的MySQL HeatWave Service,该值始终为PRIMARY。
3.1 COMMAND字段说明
- Binlog Dump 表示这是一个在复制源上的线程,负责将二进制日志内容发送到副本
- Change user 表示该线程正在执行一个改变用户操作
- Close stmt 该线程正在关闭一个
prepared statement。 - Connect 被连接到源的复制接收线程和复制工作线程使用。
- Connect Out 一个副本正在连接到其源。
- Create DB 正在执行一个创建数据库操作
- Daemon 该线程是服务器内部的线程,而不是为客户端连接提供服务的线程
- Debug 线程正在生成调试信息
- Delayed insert 该线程是一个延迟写入处理程序
- Drop DB 该线程正在执行删除数据库操作
- Error 错误
- Execute 线程正在执行
prepared statement - Fetch 线程正在获取
prepared statement的结果 - Field List 线程正在检索表列的信息
- Init DB 该线程正在选择默认数据库
- Kill 正在杀死另外一个线程
- Long Data 线程正在检索执行
prepared statement的结果中的长数据 - Ping 该线程正在处理服务器
ping请求 - Prepare 线程正在准备
prepared statement - Processlist 该线程正在生成有关服务器线程的信息。
- Query 在单线程复制应用程序线程以及复制协调器线程执行
query时,用于用户客户端。 - Quit 线程正在终止。
- Refresh 线程正在刷新表、日志或缓存,或重置状态变量或复制服务器信息
- Register 从属线程正在注册副本服务器
- Reset stmt 线程正在重置
prepared statement。 - Set option 线程正在设置或重置客户端语句执行选项。
- Shutdown 线程正在关闭服务器。
- Sleep 线程正在等待客户端向其发送新语句。
- Statistics 线程正在生成服务器状态信息。
- Time (目前未使用该状态)
COMMAND字段说明参考:https://dev.mysql.com/doc/refman/8.0/en/thread-commands.html
3.2 STATE字段状态说明
- Sleep:连接处于空闲状态,没有正在执行的命令。
- Query:连接正在执行一个查询。
- Locked:连接正在等待锁定资源。
- Copying to tmp table:连接正在将结果复制到临时表中。
- Sending data:连接正在发送查询结果给客户端。
- Sorting result:连接正在对结果进行排序。
- Waiting for table flush:连接正在等待表的刷新。
- Repair by sorting:连接正在执行表的修复操作。
- Creating sort index:连接正在创建排序索引。
STATE字段说明参考:https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html
四、实战监控与故障排查
4.1 基础连接统计
--查询当前连接数
select count(*) from information_schema.processlist;
--查询每个用户的连接数
select user, count(*) as conn_count
from information_schema.processlist
group by user
order by conn_count desc;
--查询当前执行SQL语句最多的IP
select host, count(*) as conn_count
from information_schema.processlist
where command != 'sleep'
group by host
order by conn_count desc;
4.2 慢查询与长连接排查
--查询执行时间超过10秒的SQL
select * from information_schema.processlist where command='Query' and time > 10;
--查询所有正在执行的SQL
select id, user, host, db, time, state, info
from information_schema.processlist
where command='Query';
-- 查询执行时间超过2分钟的线程,然后拼接成kill语句
select concat('kill ', id, ';')
from information_schema.processlist
where command != 'Sleep'
and time > 2*60
order by time desc
kill掉这个链接的线程,具体看官网文档:https://dev.mysql.com/doc/refman/5.7/en/kill.html
4.3 锁等待与异常线程分析
-- 查找处于Locked状态且持续超5秒的线程
select id, user, host, time, state, info
from performance_schema.processlist
where state = 'locked' and time > 5;
-- 结合innodb状态日志分析死锁
show engine innodb status\G;
五、总结
information_schema.processlist是MySQL监控的重要工具。核心作用包括:
- 实时监控连接状态,快速定位空闲连接、异常线程;
- 排查慢查询、锁等待、连接泄露等性能问题;
- 配合
command、state、time字段,精准分析SQL执行瓶颈; 8.0+版本需优先使用performance_schema替代information_schema,避免未来版本兼容问题。
提示:结合
show engine innodb status;(查看InnoDB状态)和慢查询日志,可更全面地优化数据库性能~

浙公网安备 33010602011771号