MySQL Server中同条件SELECT快但DELETE执行无终止的原因排查
这种情况我在日常运维里碰到过好多次,多半和锁、事务依赖或者表的隐性关联有关,给你列几个最可能的原因,附排查方向:
事务锁等待(最常见)
大概率是有其他会话先持有了这条数据(或表)的锁没释放。比如另一个客户端执行了SELECT * FROM tabl1 WHERE U_ID='2345' FOR UPDATE,或者做了更新/删除操作但没提交事务,你的DELETE就会一直处于锁等待状态。
排查命令:-- 查看当前InnoDB事务状态 SHOW ENGINE INNODB STATUS; -- 列出所有活跃事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 查看锁等待详情 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;外键约束导致的全表扫描
如果tabl1的U_ID被其他表设为外键,而那个子表没有给外键字段建索引,那么执行DELETE时,InnoDB会强制全扫子表来检查是否有引用关系——哪怕你只删一行,也可能因为子表数据量大而卡住。
排查:检查关联子表的结构,看外键字段是否有索引,或者临时关闭外键检查(风险操作,需谨慎)测试:SET FOREIGN_KEY_CHECKS=0;再执行DELETE试试。触发器拖慢/卡住
如果tabl1上定义了DELETE触发器,比如触发器要同步数据到其他表、做复杂计算或查询,那么触发器内部的操作可能出了问题(比如触发器里的查询卡住),导致整个DELETE一直处于执行状态。
排查命令:SHOW TRIGGERS LIKE 'tabl1';大字段或大量关联数据的清理
虽然SELECT返回的结果看起来少,但如果该行包含大字段(比如TEXT/BLOB),或者关联了大量其他数据(比如分区表、全文索引),DELETE时需要回收存储空间、更新索引,这个过程可能耗时很久,看起来像卡住。表级锁或后台维护冲突
比如你的表是MyISAM引擎(现在很少用,但不排除),MyISAM的DELETE会加表级锁,如果此时有其他读操作在跑,就会等待;或者刚好碰到MySQL后台在做表维护(比如ANALYZE TABLE、OPTIMIZE TABLE),占用了资源导致DELETE阻塞。
内容的提问来源于stack exchange,提问作者mao

