У меня странная проблема с запросом 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 ГБ ОЗУ). Есть мысли о том, как решить эту проблему? спасибо.