State 表示什么
information_schema.processlist 与 SHOW PROCESSLIST 的 State 列描述线程当前正在做的事,它是判断「这条连接卡在哪一步」的最快入口。多数 State 文本是内部阶段名而非字面意思,例如 Sending data 指的是读取并发送结果集的整个阶段而不仅仅是网络发送,理解这些命名习惯才能读对现场。
基本信息
| 适用平台 | MySQL 5.7 / 8.0、MariaDB |
|---|---|
| 关键视图 | information_schema.processlist、SHOW FULL PROCESSLIST |
| 核心列 | Id、User、Command、Time、State、Info |
| 权限 | PROCESS 权限才能看到其他用户的连接 |
| 精确定位 | performance_schema.events_waits_current、data_lock_waits |
典型使用场景
- 线上响应变慢时先看连接都在哪个阶段,判断是锁等待还是扫描
- 排查连接池打满:确认是空闲连接过多还是执行中的长查询堆积
- 定位阻塞源头:行锁与元数据锁的等待都要找到持有方
- DDL 前确认没有长事务,避免加锁操作被长时间阻塞
- 监控 TempTable 相关状态,发现临时表频繁落盘
聚合与定位阻塞
聚合与定位阻塞
-- 按阶段聚合,先看卡点分布
SELECT state, COUNT(*) AS n, MAX(time) AS max_wait
FROM information_schema.processlist
GROUP BY state
ORDER BY n DESC;
-- 找出执行时间最长的非 sleep 连接
SELECT id, user, host, db, state, time, info
FROM information_schema.processlist
WHERE command <> 'Sleep' ORDER BY time DESC LIMIT 20;
-- 行锁阻塞链条(MySQL 8.0)
SELECT * FROM sys.innodb_lock_waits\G常见 State 与含义
| State | 含义与常见原因 |
|---|---|
| Sending data | 读取并发送结果集的阶段,常伴随大量扫描或回表 |
| Sorting result / Creating sort index | 排序或使用 filesort,检查 ORDER BY 能否走索引 |
| Copying to tmp table | 生成临时表,内存不足会落盘,受 tmp_table_size 影响 |
| Waiting for table metadata lock | 被 DDL 或长事务持有 MDL 阻塞,等待方往往整表卡住 |
| Waiting for table flush | 有会话占着表导致 FLUSH TABLES 无法完成,常与备份、DDL 相关 |
| Opening tables | 打开表定义,短时大量出现说明 table_open_cache 偏小 |
| statistics | 优化器收集统计信息以决定执行计划,长期停留说明统计信息复杂 |
| Sleep | 空闲连接,连接池的常态;异常升高说明池配置或存在连接泄漏 |
MySQL 8.0 中行锁等待在 State 里不总是直观显示,用 performance_schema.data_lock_waits 与 sys.innodb_lock_waits 能看到持有方与被阻塞方的线程、SQL 与等待时长。
kill 连接前先看清线程是否在提交或回滚:终止一个大事务可能触发长时间回滚,反而加重 IO 压力。