2012-03-04 54 views
0

我有一个奇怪的问题与查询MySQL使用红宝石的mysql2适配器。我使用ruby-1.9.2-p290mysql2-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的客户机运行)上窒息。任何想法如何解决这个问题?谢谢。

+0

如果我正确地阅读你的问题,它实际上并不呛在查询上,而是在块内。那是对的吗?如果是这样,mysql不是问题。 – sosborn 2012-03-04 09:37:05

+0

这是正确的,我的意思。但是,它在使用'Mysql2 :: Result'的块内展现了这种行为。所以我不确定如何更好地说明这一点。 – sa125 2012-03-04 10:00:37

回答

0

多挖后,原来这是由我的编码设置在environment.rb造成的,在那里我有:

Encoding.default_internal = 'UTF-8' 

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

评论该行解决了问题。