【发布时间】:2012-03-04 09:33:12
【问题描述】:
我在使用 ruby 的 mysql2 适配器查询 MySQL 时遇到了一个奇怪的问题。我正在使用ruby-1.9.2-p290 和mysql2-0.2.18.gem(因为mysql2 >= 0.3 有Rails 2.3.14 的问题,我必须这样做)。它工作正常,除了我在数据库上执行的特定查询 - 查询返回正常,但处理结果需要不合理的时间(与我从 ruby 1.8 升级之前使用的旧 ruby-mysql gem 相比)。代码的要点如下所示:
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 实例中运行上述代码时(没有 rails 开销),它运行良好——这让我相信这可能是一个内存/GC 问题。
mysql2(特别是 Mysql2::Result)会在大型查询(客户端计算机运行 QuadCore 和 8GB RAM)时阻塞,这似乎很奇怪。关于如何解决这个问题的任何想法?谢谢。
【问题讨论】:
-
如果我正确阅读了您的问题,它实际上并不是在查询中窒息,而是在块内。那是对的吗?如果是这样,mysql 不是问题。
-
没错,就是我的意思。但是,它在
Mysql2::Result上运行的块内表现出这种行为。所以我不知道如何更好地表达这一点。
标签: performance memory-leaks ruby-1.9.2 ruby-on-rails-2 mysql2