看当前在跑什么语句
实例变慢时第一步通常是看此刻有哪些连接、分别在执行什么。这类查询给出的是一个瞬时快照:连接标识、已持续秒数、当前状态、正在执行的语句。诊断的关键在状态列,它直接指出等待类型——是在读数据、在等元数据锁还是在等行锁。单次查看容易错过一瞬间的状态,规律性地连续观察几次比看一次更可靠。
基本信息
| 适用平台 | MySQL 8.0 |
|---|---|
| 查看方式 | 专用语句或查询元数据表,后者可加过滤条件 |
| 关键列 | 连接标识、用户、持续秒数、状态、正在执行的语句 |
| 快照特性 | 只反映当前时刻,需要多次观察 |
| 终止手段 | 终止单条语句与断开整个连接是两种操作 |
典型使用场景
- 实例响应变慢:找出执行时间异常长的语句
- 定位元数据锁等待:结构变更被长事务挡住
- 处理跑飞的查询:确认后终止单条语句
- 连接数异常升高:查看哪些连接长期空闲
- 排查连接池与业务的连接泄漏
查看与处理
查看与处理
-- 完整列出当前连接与正在执行的语句
SHOW FULL PROCESSLIST;
-- 过滤出运行时间较长的语句,便于排序观察
SELECT id, user, time, state, LEFT(info, 100) AS query
FROM information_schema.processlist
WHERE command <> 'Sleep' AND time > 5
ORDER BY time DESC;
-- 终止单条语句,保留连接
KILL QUERY 12345;
-- 断开整个连接(连接池场景要评估重连影响)
KILL 12345;
-- 连续观察几次,确认语句是否一直卡在同一状态
-- 只跑一次看到的是快照,容易错过瞬时状态关键列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| 连接标识 | 连接的唯一编号 | 终止操作需要它 |
| 持续秒数 | 当前状态已保持的时间 | 空闲连接同样在增长,需按命令类型过滤 |
| 状态列 | 正在做什么或等待什么 | 出现等待元数据锁或等待行锁 |
| 语句列 | 正在执行的语句片段 | 需要权限才能看到完整内容 |
| 命令类型 | 空闲或正在执行 | 大量空闲连接说明连接池配置偏大 |
等待元数据锁是结构变更的经典卡点:一条长事务持有该表的元数据,后续的加列、加索引语句就会一直等待。处理顺序是先找到持有者,而不是反复重试变更语句。
终止语句要评估代价:大事务被中止后回滚同样耗时,期间会继续占用资源。终止整个连接还会让连接池重建连接,瞬时压力可能不降反升。