几十万行一个事务,锁和 undo 都扛不住。
按主键区间切批,每批几千行提交一次。
循环里更新 count 到阈值就 commit 再开新事务。
批大小按行宽调,一般 1000 到 5000 起步。
中间失败要能续跑,记下最后处理的主键。
-- 按主键区间切批,每批 5000 行,提交后再推进
UPDATE orders SET status = 'done'
WHERE id > 0 AND id <= 5000 AND status = 'pending';
-- 记下本批最大 id,下一批从 5001 开始循环
-- 监控锁等待:每批耗时、innodb_row_lock_time
SELECT MAX(id), COUNT(*) FROM orders WHERE id <= 5000 AND status = 'pending';
THE END






暂无评论内容