在大表中执行所有记录的批量更新的最佳方法是什么

时间:2019-04-23 14:11:57

标签: mysql ruby-on-rails ruby

在MySQL大表中执行所有记录的批量更新的最佳方法是什么?

在清理过程中,我们将更新用户表中的所有行(该表包含28M行)以掩盖几列。目前,在rake任务中大约需要2个小时才能完成,AWS会话的到期时间也为2个小时。如果rake任务花费的时间超过会话到期时间,则构建将失败。

由于有大量记录,我们使用find_in_batches一次更新了25K行,然后在结果中更新了all。我们通过休眠0.1秒来避免每批之间的冲突,以避免CPU占用过多。

所以问题是,有什么方法可以进一步优化批量更新,还是应该将AWS会话到期时间增加到3小时?

一种选择是按ID范围进行批处理,而不是按确切的批处理大小进行批处理。因此,请在ID 1-100000之间更新,然后在100001-200000之间更新,依此类推。这样可以避免传递大量ID。由于id之间会有间隙,因此每批的大小会有所不同,但这可能不是问题。

感谢您的输入。

1 个答案:

答案 0 :(得分:0)

对于如此大的更新,获取记录和实例化AR对象的开销非常重要(而且GC的运行速度也会降低),最快的执行方法-编写将执行更新的原始sql查询(或使用{ {1}}来构造它,这非常相似,但是允许通过关系使用作用域/联接。