2011-02-15 285 views
1

我有一個查詢在MySQL控制檯中運行速度非常快,但使用Rails Active Record運行時速度很慢。這是針對700萬條記錄的表運行查詢:查詢在MySQL中速度很快,但從Rails運行時速度很慢ActiveRecord

選擇 broker_id,計數(abserror),AVG(abserror) fc_estimates 其中(FPE> '2000年5月28日') and(fpe <'2003-06-30')group by broker_id order by broker_id;

需要3分鐘才能運行。

然後我在Rails Active Record中運行這個查詢:

stats =估計值。 選擇([ 「broker_id」, 「計數(abserror)作爲abserror_count」, 「AVG(abserror)作爲abserror_avg」 ])。 其中(:fpe =>((fpe-1098).to_date ..(fpe + 30).to_date)) (「broker_id」)。 順序( 「broker_id」)

生成此SQL(從to_sql輸出)

SELECT broker_id,計數(abserror)作爲abserror_count,AVG(abserror)作爲abserror_avg FROMfc_estimatesWHEREfc_estimatesfpe之間 '2000年5月28日' '2003-06-30')GROUP BY經紀人_id ORDER BY broker_id

需要1小時40分鐘才能運行。它返回250條記錄。

我使用Windows 7,MySQL 5.1中,紅寶石1.8.7,ActiveRecord的3.04,mysql2寶石0.2.6

這是InnoDB表和我有innodb_buffer_pool_size提高到480M(這確實與其他問題的幫助) 。我所觀察到的一件事是,MySQL內存使用量高達約500M,然後有很多磁盤活動(頁面交換)。這可以解釋爲什麼。

但是爲什麼我在MySQL控制檯中運行同樣的查詢只需要3分鐘時性能很差?感謝任何想法或經歷過類似情況的任何人。

UPDATE 2011-02-24

我更新到MySQL 5.5。現在我在控制檯中的查詢運行大約1分40秒。使用ActiveRecords大約需要40分鐘。

+0

您可能會看到mysql查詢緩存的結果。嘗試在mysql中再次計時查詢,但在SELECT之後放置SQL_NO_CACHE以禁用查詢緩存。 – 2011-02-15 13:29:40

+0

是的,我想我明白這一點。第二次在控制檯中運行查詢時,運行速度非常快。所以我的查詢在3分鐘內運行 - 第二次運行速度非常快。我不認爲就是這樣,但我會檢查。 – 2011-02-15 13:38:50

回答

1

在Ruby代碼中運行的不止是SQL查詢。我不是Ruby Jedi,但我可以指出一些東西。

Windows不是使用MRI的最佳地點。也許你應該嘗試1.9.2或JRuby - 甚至切換到一些* nix OS。

(fpe-1098).to_date..(fpe+30).to_date)爲日期間隔構建一個Range實例。也許你應該嘗試一種不同的語法,例如:['fpe > ? AND fpe < ?'(fpe-1098),(fpe+30)] - 這樣會創建更少的對象。

由於您沒有檢索Estimate實例,因此您可以將生成的sql傳遞給ActiveRecord::Base.connection.execute,而不是使用model類運行查詢。也許會有更少的內存使用和創建的對象。

相關問題