0

ruby의 mysql2 어댑터를 사용하여 MySQL을 쿼리하는 데 이상한 문제가 있습니다. ruby-1.9.2-p290mysql2-0.2.18.gem을 사용하고 있습니다 (mysql2 >= 0.3에는 Rails 2.3.14와 관련된 문제가 있습니다.). 그것은 DB에서 수행하고있는 특정 쿼리를 제외하고는 잘 작동합니다. 쿼리는 정상적으로 반환되지만 결과를 처리하는 것은 (루비 1.8에서 업그레이드하기 전에 사용했던 오래된 ruby-mysql 보석과 비교하여) 무리한 시간이 걸립니다. 내가 밖으로 내부의 코드를 설정하고 eventuall 블록 내부의 모든 주석하지만,이 성능 병목의 원인이 될 수있는 것을 볼 수없는 한레일즈 2.3에서 mysql2의 성능 문제를 추적하려고 시도했습니다.

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 

: 코드의 요지는 다음과 같이 보인다.

동일한 연결을 사용하여이 특정 프로그램에서 많은 쿼리를 수행하고 있음을 유의해야합니다. 이는 큰 결과 집합으로 인해 발생할 수있는 유일한 곳입니다. DB 서버에서 직접이 쿼리를 실행했지만 특별한 일은 없었습니다. 또한이 문제는 Rails의 script/console 컨텍스트에서 실행하거나 Rails 애플리케이션 내부에서 호출 할 때만 발생합니다. 위의 코드를 간단한 IRB 인스턴스 (레일 오버 헤드 없음)에서 실행하면 정상적으로 실행됩니다. 이것이 메모리/GC 문제 일 수 있다고 생각합니다.

mysql2 (특히)은 큰 쿼리 (클라이언트 컴퓨터가 QuadCore 및 8GB RAM으로 실행 됨)에서 질식합니다. 이 문제를 해결하는 방법에 대한 의견이 있으십니까? 감사. 더 파고 후

+0

질문을 올바르게 읽는다면 쿼리에서 실제로 질식하지는 않지만 블록 안에 있습니다. 그 맞습니까? 그렇다면 mysql이 문제가되지 않는다. – sosborn

+0

맞습니다. 그리고 제가 의미하는 바입니다. 그러나,'Mysql2 :: Result'에서 동작하는 블록 내부에서 이러한 동작을 보여줍니다. 그래서 나는 이것을 더 잘 표현하는 방법을 모르겠습니다. – sa125

답변

0

는, 내가 가진 곳은 environment.rb 내 인코딩 설정에 의해 발생 된 밝혀 :

Encoding.default_internal = 'UTF-8' 

은 분명히 Mysql2 분명히 많이 소비되는 결과 집합에있는 모든 문자열을 다시 인코딩 된 리소스 (큰 결과 집합의 경우)

해당 라인을 주석 처리하여 문제가 해결되었습니다.