我有一個奇怪的問題與查詢MySQL使用紅寶石的mysql2
適配器。我使用ruby-1.9.2-p290
和mysql2-0.2.18.gem
(因爲mysql2 >= 0.3
與Rails 2.3.14存在問題,我一定會遇到這個問題)。除了我在數據庫上執行的特定查詢之外,它工作正常 - 查詢返回正常,但處理結果花費的時間不合理(與從Ruby 1.8升級之前使用的舊的ruby-mysql
寶石相比)。代碼的要點看起來是這樣的:試圖追蹤與軌道上的mysql2的性能問題2.3
require 'mysql2'
client = Mysql2::Client.new({
:host => 'localhost',
:username => 'minda',
:password => 'sikriT',
:database => 'testdb'
})
# pretty elaborate query, utilizing
# several joines and returning about
# ~200,000 rows
sql = "SELECT * FROM ..."
# returns in reasonable time
results = client.query(sql, :cast => false)
# this takes about 3 minutes...
# before the switch to 1.9/mysql2, this took
# about 10 sec (which was reasonable,
# considering I did some fairly
# processing inside the block)
results.each do |row|
# do nothing here!
end
我已經變成裏面的代碼並eventuall註釋掉塊內的一切,卻看不到什麼可能會導致這樣的性能瓶頸。
我應該注意到,我正在使用相同的連接在這個特定的程序中執行很多查詢,並且這是唯一的地方 - 可能是由於大的結果集。我直接在數據庫服務器上運行這個查詢,沒有發生任何特別的事情我還注意到這隻發生在Rails'script/console
的上下文中運行此程序或從Rails應用程序內部調用它時發生。當我在一個簡單的IRB實例中運行上面的代碼時(沒有rails開銷),它運行良好 - 這導致我相信這可能是內存/ GC問題。
看起來很奇怪,mysql2
(特別是,Mysql2::Result
)會在大型查詢(用QuadCore和8GB RAM的客戶機運行)上窒息。任何想法如何解決這個問題?謝謝。
如果我正確地閱讀你的問題,它實際上並不嗆在查詢上,而是在塊內。那是對的嗎?如果是這樣,mysql不是問題。 – sosborn 2012-03-04 09:37:05
這是正確的,我的意思。但是,它在使用'Mysql2 :: Result'的塊內展現了這種行爲。所以我不確定如何更好地說明這一點。 – sa125 2012-03-04 10:00:37