SHOW FULL PROCESSLIST输出中State` 列的所有可能值,以及这些值代表的含义,这能帮你精准判断数据库连接的状态(包括锁相关、执行状态等)。
一、State 列核心分类及含义
State 列描述了当前线程正在执行的操作状态,不同状态对应不同的数据库行为,以下是最常见且实用的分类(按场景划分):
1. 锁相关状态(排查锁表核心)
这是你最关心的锁表相关状态,直接反映锁等待 / 阻塞:
| 状态值 | 含义 |
|---|---|
Waiting for table lock | 等待表级锁(MyISAM 引擎为主,InnoDB 显式加表锁时也会出现) |
Waiting for row lock | 等待行级锁(InnoDB 引擎行锁冲突,比如更新同一行数据) |
Waiting for metadata lock | 等待元数据锁(比如修改表结构时,其他线程正在读写该表) |
Waiting for global read lock | 等待全局读锁(比如执行 FLUSH TABLES WITH READ LOCK 时) |
Waiting for unlock | 等待解锁(线程持有锁但等待其他锁释放) |
2. 查询执行相关状态
反映 SQL 执行过程中的阶段:
| 状态值 | 含义 |
|---|---|
Sending data | 正在向客户端返回查询结果(不是 “发送数据慢”,可能是查询计算 / 扫描数据耗时) |
Executing | 正在执行 SQL 语句(核心执行阶段) |
Preparing | 预处理 SQL(比如预处理语句 PREPARE) |
Sorting result | 正在对查询结果排序(比如 ORDER BY 未命中索引) |
Creating sort index | 创建临时排序索引(排序时无可用索引,性能差) |
Copying to tmp table | 将结果复制到临时表(比如 GROUP BY 未命中索引) |
Reading from net | 从客户端读取 SQL 语句 |
Writing to net | 向客户端发送数据 |
3. 连接 / 空闲相关状态
| 状态值 | 含义 |
|---|---|
Sleep | 线程空闲(无操作),等待客户端发送新的 SQL |
Connected | 刚建立连接,还未执行 SQL |
Login | 客户端正在登录数据库 |
4. 事务相关状态
| 状态值 | 含义 |
|---|---|
Starting | 事务开始阶段 |
Committing | 事务提交阶段 |
Rolling back | 事务回滚阶段 |
Waiting for transaction lock | 等待事务锁 |
5. 其他常见状态
| 状态值 | 含义 |
|---|---|
Analyzing | 分析查询语句(优化器阶段) |
Checking permissions | 检查用户权限 |
Opening tables | 打开表(表缓存不足时会频繁出现) |
Closing tables | 关闭表 |
Updating | 正在执行更新操作(UPDATE/DELETE) |
Inserting | 正在执行插入操作(INSERT) |
二、关键说明
- 状态是动态的:
State是线程的瞬时状态,同一线程的状态会随操作阶段变化(比如从Executing变为Sending data); - 空值情况:部分线程(如系统线程)的
State可能为空; - 异常识别:如果大量线程停留在
Waiting for table lock/Waiting for metadata lock等 “Waiting” 类状态,且持续时间长,说明存在锁阻塞或性能问题。
三、实用示例:筛选异常状态
你可以通过以下 SQL 快速筛选出锁等待 / 阻塞的线程:
-- 筛选所有锁等待相关的线程
SELECT id, user, host, db, command, time, state, info
FROM information_schema.processlist
WHERE state LIKE 'Waiting for%lock%'
AND info IS NOT NULL;
总结
- 核心锁状态:排查锁表重点关注
Waiting for table lock、Waiting for row lock、Waiting for metadata lock这三类状态; - 性能相关:
Copying to tmp table、Sorting result等状态通常提示 SQL 未优化(缺少索引); - 空闲状态:
Sleep状态线程过多可能是连接未释放,需检查应用连接池配置。