MySQL删除重复行遇Lock wait timeout exceeded错误求助
MySQL删除重复行触发锁等待超时的原因
- 数据量与重复规模过大:如果Entrega表总数据量多,或者单条Path对应的重复条目数量大,这条DELETE语句会扫描并锁定大量行,锁持有时间超过MySQL默认的
innodb_lock_wait_timeout阈值(通常50秒),直接触发超时。 - 缺少适配的索引:你的DELETE语句依赖
Path和id两个字段匹配重复行,但如果没有创建这两个字段的联合索引,MySQL会执行全表扫描,不仅查询效率极低,还会给扫描到的所有行加锁,长时间占用锁资源导致超时。 - 并发事务冲突:执行删除操作时,若有其他事务正在访问或修改Entrega表的相关行(比如查询、更新、删除),这些事务会占用锁资源,你的DELETE事务等待锁的时间超过限制就会报错。
- 单事务处理数据过多:这条语句会一次性删除所有重复行,当重复数据量极大时,单个事务的执行时间会被拉得很长,锁持有时间超出阈值。
优化方案
- 创建联合索引:先给
Path和id创建联合索引,让MySQL快速定位重复行,减少扫描范围和锁的数量:CREATE INDEX idx_path_id ON Entrega(Path, id); - 分批删除重复行:不要一次性删除所有重复数据,用LIMIT控制单次删除的行数,重复执行直到没有重复行,比如:
DELETE t1 FROM Entrega t1 INNER JOIN Entrega t2 WHERE t1.id > t2.id AND t1.Path = t2.Path LIMIT 1000; - 临时调整锁等待超时:可以临时调大锁等待时间阈值(不建议长期使用):
SET GLOBAL innodb_lock_wait_timeout = 120; - 低峰期执行:选择系统并发量低的时间段执行删除操作,减少与其他事务的锁冲突。
内容的提问来源于stack exchange,提问作者user20911687
相关产品推荐
相关产品推荐

