2013-02-27 3 views
0

약 9 십만 개의 레코드가있는 테이블이 있습니다. 우리는 큰 데이터를 갖는 쿼리를 실행하기 위해 노력하고있다 (참고 : 쿼리가 큰)mysql 대형 쿼리가 응답하지 않습니다.

like <some query> and agt.item in (',productRange,.......<very large data, having around 2 lakh chars>) 

를이 쿼리로 말하는 구문 오류가 실패합니다. 쿼리의 항목 수가 적 으면 실행됩니다. 이런 종류의 문제를 처리하는 방법을 알려주십시오.

+0

:로

SELECT some_field FROM table1 WHERE condition1; -- returns a long list and/or large strings SELECT * FROM table2 WHERE condition2 AND item IN (@records_from_previous_query); 

당신은 단지 그것을 다시 할 수있다. 어쨌든 전체 쿼리를 받기 전에 시간이 초과 되었습니까? – sjdaws

+1

나는 십만 *가 더 널리 이해된다고 생각하지만 무례하지만 나는 라크를 편집했다. – George

+0

그것의 시간 초과하지만 구문 오류가 있지만 잘 작동 일부 항목을 제거 말하는. 쿼리에서 큰 데이터를 갖는 이러한 종류의 쿼리를 처리하는 방법을 이해하고 싶습니다. – dsr301

답변

3

대부분의 DBMS는 큰 매개 변수 목록과 함께 작동하지 않습니다. 큰 "IN"목록이있는 경우 (예 : MySQL은 테이블 반환 매개 변수를 가지고 있지 않는 한,

CREATE TABLE baz (
    bar VARCHAR 
) 

INSERT INTO baz(bar) VALUES ('1'); 
INSERT INTO baz(bar) VALUES ('2'); 
INSERT INTO baz(bar) VALUES ('3'); 
INSERT INTO baz(bar) VALUES ('4'); 
... 
INSERT INTO baz(bar) VALUES ('500000'); 

SELECT * 
FROM foo, 
     baz 
WHERE foo.bar = baz.bar 

그래서 :

SELECT * 
FROM foo 
WHERE bar IN ('1','2','3','4'...,'500000') 

당신은 당신이 선택하려는 모든 값을 포함하는 테이블을 가지고, 두 테이블을 조인에 비해 매우 저조한 실적을 얻을 것이다 가장 좋은 방법은 쿼리에서 데이터를 입력하는 대신 임시 테이블에 데이터를 저장하는 것입니다. 필터링하는 값 (귀하의 경우에는 agt.item)에 대한 인덱스가 필요함을 잊지 마십시오.

+0

@Raad, 정교한 편집을 해주셔서 감사합니다. 이러한 실질적인 기여는 일반적으로 기여도에 대한 업 보스를받을 수있는 별도의 답변으로 작성됩니다. –

+0

그래, 당신은 핵심 추론에 먼저 거기에있어 - 조금만 더 장식. 외모에도 불구하고 나는 총 대리인이 아니다. – Raad

0

IN 절의 항목 항목이 다른 이전 쿼리의 값인 경우 하위 쿼리 만 사용할 수 있습니다.

현재 코드를 가정하면 다음과 같습니다 : 나는 라크는, 그것이 궁금 사람들을 위해 10 만 무엇 구글했다

SELECT * 
FROM table2 
JOIN table1 ON (table1.some_field = table2.item AND condition1) 
WHERE condition2 
관련 문제