我有一個查詢在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_estimates
WHERE(fc_estimates
。fpe
之間 '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分鐘。
您可能會看到mysql查詢緩存的結果。嘗試在mysql中再次計時查詢,但在SELECT之後放置SQL_NO_CACHE以禁用查詢緩存。 – 2011-02-15 13:29:40
是的,我想我明白這一點。第二次在控制檯中運行查詢時,運行速度非常快。所以我的查詢在3分鐘內運行 - 第二次運行速度非常快。我不認爲就是這樣,但我會檢查。 – 2011-02-15 13:38:50