【问题标题】:Trying to trace performance issue with mysql2 on rails 2.3尝试在 Rails 2.3 上跟踪 mysql2 的性能问题
【发布时间】: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


【解决方案1】:

经过大量挖掘,原来这是由我在environment.rb 中的编码设置引起的,我在那里:

Encoding.default_internal = 'UTF-8'

显然Mysql2 正在重新编码结果集中的所有字符串,这显然会消耗大量资源(对于大型结果集)。

评论该行解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2011-08-28
    • 1970-01-01
    • 2010-09-06
    • 2011-09-23
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多