如何查看MySQL中已卡住20000+秒的查询?
获取完整的卡住进程信息
截图里的进程列表大概率截断了SQL语句,执行以下命令查看完整内容:SHOW FULL PROCESSLIST;
或者通过系统表精准筛选超时进程:SELECT id, user, host, db, command, time, state, info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE time > 20000;
其中info字段就是卡住的完整SQL语句。分析查询执行效率
拿到目标SQL后,用EXPLAIN查看执行计划,判断是否存在索引缺失、全表扫描、关联逻辑不合理等问题:EXPLAIN 你的卡住SQL语句;
重点关注type(访问类型,ALL代表全表扫描,效率极低)、key(是否用到有效索引)、rows(预估扫描行数)这几个核心字段。排查锁等待问题
如果是事务锁导致的卡住,先查询长时间运行的事务:SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX WHERE trx_started < NOW() - INTERVAL 20000 SECOND;
再查看锁资源和锁等待关系:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
这些表能帮你明确阻塞源(谁持有锁)和被阻塞的进程。临时应急处理
确认是无效查询后,可执行KILL 进程ID;终止卡住的进程,但需注意:未提交的事务会触发回滚,可能影响业务,操作前务必确认风险。
内容的提问来源于stack exchange,提问作者Ujjwal Raijada

