DELETE直接删百万行会卡死或锁表因其生成大事务、写undo log、触发索引更新、易锁升级且binlog/WAL暴涨应分批LIMIT删除并动态监控数据库负载。DELETE 语句直接删百万行为什么卡死或锁表因为 DELETE FROM table WHERE ... 在大多数数据库如 MySQL InnoDB、PostgreSQL里会生成单个大事务它要写 undo log、触发索引更新、可能阻塞其他读写还容易触发锁升级比如从行锁升到表锁。更糟的是如果没加 LIMIT事务日志binlog / WAL会暴涨主从延迟飙升甚至 OOM。实操建议永远不要对线上大表执行无 LIMIT 的 DELETE确认该表有高效过滤的索引——WHERE 条件字段必须走索引否则每次扫描都是全表先用 SELECT COUNT(*) 和 EXPLAIN 验证查询路径别靠感觉MySQL 用户注意DELETE LOW_PRIORITY 不解决本质问题只是让写入排队反而延长锁持有时间分批次删除怎么控制每批数量和间隔核心不是“删多少”而是“别让数据库喘不过气”。常见错误是固定睡 100ms但实际负载波动大应该动态响应。实操建议每批用 LIMIT 10005000MySQL 推荐 ≤5000PostgreSQL 可稍高但别超 1w删除后立刻查 SHOW PROCESSLISTMySQL或 pg_stat_activityPG发现有长事务或锁等待就主动加休眠用 SLEEP(0.1) 或应用层 time.Sleep(100 * time.Millisecond) 控制节奏别用 usleep 级别——太短没意义还增加调度开销避免在循环里反复执行 SELECT COUNT(*) 统计剩余量改用“删完一批返回影响行数为 0 则退出”MySQL 中用 DELETE LIMIT 实现安全分批DELETE ... LIMIT 是 MySQL 原生支持的分批机制但必须配合 WHERE 条件和索引否则 LIMIT 会失效优化器可能忽略。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。