2012-03-04 49 views
0

我有一個奇怪的問題與查詢MySQL使用紅寶石的mysql2適配器。我使用ruby-1.9.2-p290mysql2-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的客戶機運行)上窒息。任何想法如何解決這個問題?謝謝。

+0

如果我正確地閱讀你的問題,它實際上並不嗆在查詢上,而是在塊內。那是對的嗎?如果是這樣,mysql不是問題。 – sosborn 2012-03-04 09:37:05

+0

這是正確的,我的意思。但是,它在使用'Mysql2 :: Result'的塊內展現了這種行爲。所以我不確定如何更好地說明這一點。 – sa125 2012-03-04 10:00:37

回答

0

多挖後,原來這是由我的編碼設置在environment.rb造成的,在那裏我有:

Encoding.default_internal = 'UTF-8' 

顯然Mysql2重新編碼被所有的字符串在結果集中,這顯然消耗大量的資源(對於大型結果集)。

評論該行解決了問題。