MySQL

MySQL show processlist详解

·5 分钟阅读·1830 字
📋 目录

一、一句话作用

show processlist 查看 MySQL 当前所有连接、正在执行的SQL、线程状态、锁等待、慢查询、阻塞源头。

完整版(查看所有用户+完整SQL):

show full processlist;

二、每个字段逐行详解(必须背)

字段含义(超级通俗)
Id线程ID(连接ID),kill 用这个数字
User连接MySQL的账号
Host客户端IP:端口
db当前连接的数据库
Command线程当前动作(最关键)
Time该状态持续时间(秒)
State线程执行状态(排查核心)
Info正在执行的SQL(不执行SQL显示NULL)

三、Command 字段最常见值(判断连接在干嘛)

  1. Query正在执行SQL(正常/慢查询/卡死)
  2. Sleep:连接空闲,没执行SQL(长连接)
  3. Connect:连接中
  4. Binlog Dump:主库正在给从库发binlog(主从复制)
  5. Sleep:空闲连接
  6. Killed:标记杀死,等待回滚
  7. Quit:正在退出

四、State 状态详解(排查CPU/锁/IO/慢查询 核心!)

这是排查MySQL故障的灵魂,我只给你生产最常见、最关键的:

1. 【正常执行】

  • executing:正在执行SQL
  • Sending data读取数据并返回给客户端(不是网络发送!很多人误解)
  • Sorting result:排序中
  • Updating:正在更新数据

2. 【IO/磁盘高】

  • Creating tmp table:创建临时表(SQL太差,group by/order by无索引)
  • Copying to tmp table:复制数据到临时表(性能灾难)
  • Reading from net / Writing to net:网络读写

3. 【锁等待、阻塞】

  • Waiting for table metadata lockMDL元数据锁等待(DDL与查询冲突)
  • Waiting for lock:等待行锁/表锁
  • Locked:被锁住了
  • User lock:用户锁等待

4. 【主从复制相关】

  • Connecting to master
  • Reading relay log
  • Sending binlog event to slave

5. 【线程内部等待】

  • Waiting for net read / net write
  • Waiting for flush

五、实战:3 秒判断 MySQL 出了什么问题

1. 大量 Sending data

慢查询正在疯狂扫表、没走索引、全表扫描
→ CPU 100%

2. 大量 Sleep

空闲连接太多,连接池没释放
→ 不是故障,但浪费资源

3. 大量 Waiting for table metadata lock

有人在执行 alter table,把所有查询堵住了
→ 业务全部卡死

4. 大量 Locked / Waiting for lock

事务不提交,行锁长期持有
→ 业务阻塞

5. 大量 Creating tmp table / Copying to tmp table

SQL 写得烂,没有索引,临时表爆炸
→ IO 高、CPU 高


六、最常用实战命令

1. 看完整SQL(必须加 full)

show full processlist;

2. 杀掉慢查询/阻塞语句

kill 12345;  -- 12345是Id

3. 只看正在执行的SQL

select * from information_schema.processlist where command='Query';

4. 查看执行超过 5 秒的慢SQL

select * from information_schema.processlist where time > 5;


关联文档