在ID列表中找到更好的解决方案?

时间:2014-06-25 07:47:54

标签: ruby-on-rails activerecord rails-activerecord where-in

假设我有一个id数组,可能大约有100000个id。在我无法创建临时表来进行JOIN的情况下。对我来说,简单的解决方案就是:

Product.where(id: ids)

这将生成WHERE IN子句,当数组很大时,它似乎会损害Mysql。我想知道是否有更好的解决方案呢?

2 个答案:

答案 0 :(得分:5)

如果它是连续范围,您可以尝试使用BETWEEN - Product.where id: 1..100000即可。

否则,whole_array_of_ids.each_slice(number_of_ids_mysql_can_handle){ |ids| Product.where(id: ids) } - 多个查询,但仍然可以管理。 Read about each_slice and more goodies here.

此外,许多AR查找程序方法都有batch_size个参数,但它似乎无法帮助您,因为它将使用所有ID构建整个查询,然后拍一个LIMIT最后。

答案 1 :(得分:2)

使用find_each限制一次加载的记录数。 find_each默认一次加载1000条记录,但你可以通过设置:batch_size选项来调整它:

这将一次向数据库查询1,000条记录:

Product.where(id: ids).find_each do |product|
  # do something with the product
end

或者您可以更改一次加载的记录数(约50?):

Product.where(id: ids).find_each(batch_size: 50) do |product|
  # do something with the product
end