2012-11-13 3 views
1

나는 ruby를 사용하여 MySQL 데이터베이스에서 쿼리를 수행하고 있습니다. 나는과의 UID의 일치를 찾고 있어요 :대형 세트 sql 쿼리

WHERE uid in #{VERY_LARGE_COMMA_SEPARATED_LIST} 

VERY_LARGE_COMMA_SEPARATED_LIST는 30K 이상의 항목

VERY_LARGE_COMMA_SEPARATED_LIST = ' "one","two","three",...,"30k" ' 

이며 SQL 오류가 덤프가 발생합니다

Mysql2::Error - MySQL server has gone away: 

사람이 무엇을 알고 있나요 여기서?

+1

누군가가 이것을 수정할 수 있습니까? 여기서 뭐가 문제 야? 귀하의 '큰'데이터 문자열은 어디에서 왔습니까? 텍스트 파일, CSV 파일 또는 문자열일까요? – bonCodigo

+0

그 문자열. 나는 그것을 편집했다 – prostock

+0

* 질문 * David에 물음표가 하나도 없다 ... http://dev.mysql.com/doc/refman/5.1/en/gone-away.html – oldergod

답변

0

일반적인 1MB mysql SQL 명령 버퍼를 사용해야합니다.

이 문제를 해결하기 위해, 당신은 단지 UID의를 포함 (아마도 임시) 테이블 uids,

CREATE TABLE uids (uid INT NOT NULL PRIMARY KEY); 

같은 것을 만들어야합니다 (인덱스가 uid을 위해 존재해야합니다).

다음과 같은 몇 가지 문에서 uids 테이블에 필요한 UID 년대를 삽입 :

INSERT INTO uids (uid) VALUES (1),(5),(10),..; 

마지막으로 쿼리 실행

WHERE uid IN (SELECT uid FROM uids) 

또는 같은 조인

SELECT m.* 
FROM master m, uids u 
WHERE m.uid = u.uid 
... 

결국 uids 테이블을 삭제할 수 있습니다.

수정 : uid이 정수가 아닙니다. 단순히 정의를 조정하여 VARCHAR을 대신 사용하십시오.

0

쿼리 시간이 초과되었거나 메모리가 부족한 것 같습니다.이를 제안하는 MySQL 로그에 오류가 있습니까?

나는 서버에 과부하가 걸렸습니다.

그리고 당신이 있어야합니다

where uid in (#{VERY_LARGE_CSV})

편집 : 당신은 CSV는 다음과 같이 실행 분할 수 : 등등

SELECT * from TBL where uid in (#{CSV_SUBSET})t1 
UNION 
SELECT * from TBL where uid in (#{CSV_REMAINDER})t2 

그리고있다.

+0

감사합니다. 예. 큰 쿼리를 작은 덩어리로 분해 한 다음 재결합하는 것이 좋습니다. – prostock

+0

총 버퍼 크기가 약 – mvp

+0

에 동의했기 때문에이 점은 도움이되지 않습니다. 더 좋을 것이라고는 결코 말하지 않았지만 개념은 동일하고 프로그래밍 방식으로 분할하여 실행 당 오버 헤드를 줄일 수 있지만 실제로 실패한 경우 쿼리를 최적화해야하며, 분할이 실패 할 수도 있습니다. – Michael