MySQL中SHOWFULLPROCESSLIST输出中State列的所有可能值(最新整理)

来源:这里教程网 时间:2026-03-05 11:12:20 作者:
一、State列核心分类及含义1. 锁相关状态(排查锁表核心)2. 查询执行相关状态3. 连接 / 空闲相关状态4. 事务相关状态5. 其他常见状态二、关键说明三、实用示例:筛选异常状态总结

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(比如预处理语句 PREPARESorting 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/DELETEInserting正在执行插入操作(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 lockWaiting for row lockWaiting for metadata lock 这三类状态;性能相关Copying to tmp tableSorting result 等状态通常提示 SQL 未优化(缺少索引);空闲状态Sleep 状态线程过多可能是连接未释放,需检查应用连接池配置。

到此这篇关于MySQL中 SHOW FULL PROCESSLIST` 输出中 `State` 列的所有可能值的文章就介绍到这了,

相关推荐

热文推荐