我有一个奇怪的问题与查询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