如何优化获取和更新500000条记录的id



我有一个CSV文件,其中包含用户id、单位和大小。

我想为500000个产品更新member_id

500000.times do |i|
  user = User.find(id: tmp[i])
  hash = {
    unit: tmp[UNIT],
    size: tmp[SIZE]
  }
  hash.merge!(user_id: user.id)  if user.present?
  Product.create(hash)
end

我如何优化该过程以不查找每个User对象,但可能获得一组相关哈希?

这里有两件事严重阻碍了性能。首先,您正在进行N个完全失控的User.find调用。其次,您要创建单独的记录,而不是进行大规模插入,每个记录都在自己的小事务块中运行。

一般来说,这类批量操作最好完全在SQL域中完成。您可以同时插入大量的行,通常仅受您可以提交的查询大小的限制,并且该参数通常是可调整的。

虽然一个巨大的查询可能会锁定或阻塞你的数据库一段时间,但这将是最快的更新方式。如果您需要在大规模插入期间保持系统运行,则需要将其分解为一系列较小的提交。

请记住,Product.connection是一个更低级的访问层,允许您通过查询直接操作数据。

最新更新