0

我有一个选择语句,

SELECT `metrics`.* 
FROM `metrics` 
WHERE `metrics`.`engine` = 0 
  AND (`metrics`.connection_id = 27874) 
  AND (`metrics`.`id` > 181586235) 
ORDER BY `metrics`.`id` ASC LIMIT 1000

这是通过find_each调用关系(例如metric.engines.find_each)生成的。此 select 语句每次运行时扫描 1500 万条记录。

我想通过告诉查询只查找metrics.ids 的范围(例如metrics.id > 1 AND metrics.id < 1000)来减轻数据库的负担。

有没有办法做到这一点find_each

4

1 回答 1

1

find_each可以像所有查找器方法一样应用于范围:

Metric.where("metrics.id between 1 and 1000"]).find_each { ... }

编辑:如果您需要处理所有记录但不想一次全部加载,您可以使用find_in_batches方法:

Metric.find_in_batches do |batch|
  batch.each { ... }
end 
于 2012-11-07T21:58:54.857 回答