SHOW FULL PROCESSLIST 可查看线程实时状态,但需 PROCESS 权限;Info 列默认截断(100 字符),加 FULL 才显示完整;用 \G 竖排查看更清晰,重点关注 Id、User、Host、Time、State、Info;State 中 Locked、Copying to tmp table 等值长期存在需警惕。

直接执行 SHOW FULL PROCESSLIST 就能看到每个线程的实时状态,但要注意权限和截断问题。
为什么 SHOW PROCESSLIST 返回的 SQL 语句总是被截断?
MySQL 默认只在 Info 列显示前 100 个字符,长查询或带大量参数的语句会被砍掉。这不是 phpEnv 的限制,是 MySQL 服务端行为。
- 必须用
SHOW FULL PROCESSLIST(加FULL关键字),否则连 100 字都看不到全 - 普通用户只能看到自己发起的连接;要查全部线程,登录账号得有
PROCESS权限(phpEnv 默认 root 通常满足) - 如果仍显示不全,说明语句本身超长且含二进制/JSON/BLOB 类内容,
Info列天然不保证完整——此时得结合performance_schema.events_statements_current查原始语句
在 phpEnv 的命令行里怎么快速执行并查看?
phpEnv 自带 MySQL 客户端,不用额外配置路径。直接在终端运行:
mysql -uroot -proot -e "SHOW FULL PROCESSLIST\G"
用 \G 而不是分号结尾,能让结果竖排显示,避免字段挤在一起看不清。重点关注这几列:
-
Id:线程唯一 ID,后面 kill 时要用 -
User和Host:确认是不是你 PHP 应用连上来的(比如www-data@127.0.0.1:54321) -
Time:持续秒数,>60 秒的Query命令大概率有问题 -
State:真实执行阶段,比如Updating、Locked、Sending data—— 不是“卡死”,只是当前卡在这一步 -
Info:被截断的语句,配合State才能判断瓶颈在哪
State 值里哪些最值得警惕?
不是所有非 Sleep 状态都危险,关键看是否长时间停留:
-
Locked:正在等表级锁(常见于 MyISAM 或未提交事务的 DDL),也可能是 InnoDB 行锁升级成表锁 -
Copying to tmp table:排序或 GROUP BY 数据量太大,撑爆 sort_buffer,开始写磁盘临时表 -
Creating sort index:ORDER BY 没走索引,强制内存排序,容易 OOM -
Waiting for table metadata lock:被 ALTER TABLE、DROP TABLE 等 DDL 阻塞,注意不是锁行,是锁整张表结构 -
Update或delete后长时间停在committing:可能卡在 binlog 写盘或 redo fsync,磁盘 I/O 压力大
PHP 代码里怎么拿到当前连接的线程 ID?
PHP 本身不提供“查所有线程”的接口,但可以获取当前连接的线程 ID,用于日志追踪或调试:
$thread_id
别指望用 PHP 函数遍历所有线程——那得靠 SQL 查询,PHP 只负责发命令。真正要诊断连接泄漏,得盯住 Threads_connected 变量是否随请求持续上涨,而不是单看某个 ID。
State 是瞬时快照,同一语句不同毫秒可能处于不同 State;想确认是不是真卡住,至少连续查两次 SHOW FULL PROCESSLIST,看 Time 是否持续增长、State 是否卡死不动。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











