2012-11-07 34 views
0

我有一個選擇語句,它是由生成find_each約束find_each

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

被稱爲上的關係(例如metric.engines.find_each)。這個select語句每次運行時都會掃描一千五百萬條記錄。

我想通過只查詢範圍爲metrics.id的查詢(例如metrics.id > 1 AND metrics.id < 1000)使數據庫更輕。

有沒有辦法做到這一點find_each

回答

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