Попытка отследить проблему с производительностью mysql2 на рельсах 2.3 - PullRequest
0 голосов
/ 04 марта 2012

У меня странная проблема с запросом MySQL с использованием mysql2 адаптера ruby. Я использую ruby-1.9.2-p290 и mysql2-0.2.18.gem (так как mysql2 >= 0.3 имеет проблемы с Rails 2.3.14, с которыми я связан). Он работает нормально, за исключением конкретного запроса, который я выполняю на БД - запрос возвращается нормально, но обработка результатов занимает неоправданное количество времени (по сравнению со старым гемом ruby-mysql, который я использовал перед обновлением с ruby ​​1.8). Суть кода выглядит примерно так:

    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

Я вывернул код наизнанку и, в конце концов, закомментировал все внутри блока, но не могу понять, что может быть причиной этой горловины производительности.

Я должен отметить, что я выполняю много запросов в этой конкретной программе, используя одно и то же соединение, и это единственное место, где возникает проблема - возможно, из-за большого набора результатов. Я выполнил этот запрос непосредственно на сервере БД, и ничего особенного не произошло. Я также заметил, что это происходит только при запуске этой программы в контексте Rails 'script/console или при вызове ее из приложения Rails. Когда я запускаю приведенный выше код в простом экземпляре IRB (без накладных расходов на рельсы), он работает нормально - что наводит меня на мысль, что это может быть проблема с памятью / сборщиком мусора.

Кажется странным, что mysql2 (в частности, Mysql2::Result) будет подавлять большие запросы (клиентский компьютер работает с QuadCore и 8 ГБ ОЗУ). Есть мысли о том, как решить эту проблему? спасибо.

1 Ответ

0 голосов
/ 05 марта 2012

После долгих копаний выясняется, что это было вызвано настройкой кодирования в environment.rb, где у меня было:

Encoding.default_internal = 'UTF-8'

Очевидно, Mysql2 перекодировал все строки в наборе результатов, который, очевидно, потреблял много ресурсов (для большого набора результатов).

Комментирование этой строки решило проблему.

...