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线程空闲(无操作),等待客户端发送新的 SQLConnected刚建立连接,还未执行 SQLLogin客户端正在登录数据库
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 状态线程过多可能是连接未释放,需检查应用连接池配置。到此这篇关于MySQL中 SHOW FULL PROCESSLIST` 输出中 `State` 列的所有可能值的文章就介绍到这了,
