我有一个选择语句,
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.id
s(例如metrics.id > 1 AND metrics.id < 1000
)来使数据库更轻松。
有没有办法用find_each
执行此操作?
答案 0 :(得分:1)
find_each
可以应用于所有finder方法的范围:
Metric.where("metrics.id between 1 and 1000"]).find_each { ... }
编辑:如果您需要处理所有记录但又不想一次加载所有记录,则可以使用find_in_batches方法:
Metric.find_in_batches do |batch|
batch.each { ... }
end