两张 8000 万行的表做全量对比,脚本从晚上 10 点跑到早上 7 点还没结束,iostat 里磁盘读一直是 100%。日志里能对上时间点,这种反而好排。

逐行把两边数据拉到 Python 里比对,等于把两张表完整读两遍再在内存里做差集。行数一大,内存和 IO 同时成为瓶颈,进度还看不到。对比本身并不需要行级明细,先按区间聚合就能砍掉大部分工作量。这一点先确认清楚,后面就不用反复试。

SELECT COUNT(*), SUM(amount) FROM src_order
WHERE id BETWEEN 1 AND 1000000;
SELECT COUNT(*), SUM(amount) FROM dst_order
WHERE id BETWEEN 1 AND 1000000;

「全量对比慢」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:先在库内做聚合对比 按主键区间算 count 和 sum 缩小范围;只对不一致的区间拉明细 不要全表进内存;对比任务按主键分片并行 每片单独提交;加进度输出 每 100 万行打一条日志。

结果对不对很好判断,同样一千万行区间对比从 40 分钟降到 90 秒 只有两个分片报出差异。

作者 9823189