ruby의 mysql2
어댑터를 사용하여 MySQL을 쿼리하는 데 이상한 문제가 있습니다. ruby-1.9.2-p290
과 mysql2-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으로 실행 됨)에서 질식합니다. 이 문제를 해결하는 방법에 대한 의견이 있으십니까? 감사. 더 파고 후
질문을 올바르게 읽는다면 쿼리에서 실제로 질식하지는 않지만 블록 안에 있습니다. 그 맞습니까? 그렇다면 mysql이 문제가되지 않는다. – sosborn
맞습니다. 그리고 제가 의미하는 바입니다. 그러나,'Mysql2 :: Result'에서 동작하는 블록 내부에서 이러한 동작을 보여줍니다. 그래서 나는 이것을 더 잘 표현하는 방법을 모르겠습니다. – sa125