2011-08-12 6 views
1
select docid from A where docid IN (select distinct(docid) from B) 

는 데이터의 크기에 따라 너무 긴 33초을 걸린다.MySQL은

다음은 두 테이블의 세부 사항입니다. 난 단지 select docid from A을 실행하면 0.07 초를 취하고있다 select docid from B 동안

Table A : 
    | docid  | int(11) | NO | PRI | NULL |  | 
    Total number of entries = 500 (all entries are unique) 

    Table B: 
    | docid  | int(11) | YES |  | NULL |  | 
    Total number of entries = 66508 
    (number of unique entries are 500) 

    mysql version : 5.2 

는 0.00 초를 취할 것입니다.

그런데 왜 하위 쿼리를 사용하는 IN 쿼리가 33 초가 걸리나요? 내가 뭔가 잘못하고 있는거야?

+0

해당 쿼리를 통해 달성하고자하는 목표는 무엇입니까? – Sleeperson

+0

이 쿼리는 1 초 후에 실행되어야합니다. 왜이 시간이 너무 오래 걸리는 거지? – Kunal

+0

'desc select docid from A from docid IN (B에서 distinct (docid)를 선택하십시오); - 오버플로는'IN() '과 일치시키기 위해 스캔해야하는 숫자 행 수입니다. – ajreal

답변

4

MySQL은 IN (하위 쿼리)을 제대로 처리하지 않습니다. 결과를 "기억"하기보다는 외부 쿼리가 평가 될 때마다 내부 쿼리를 실행합니다.

따라서 참여를하는 것이 훨씬 낫습니다.

다른 RDBMS는이 작업을 수행하지 않습니다.

+0

을 참조하십시오. 브라이언에게 감사의 말을 전합니다. – Kunal

6

IN 목록은 매우 크며 60K 항목입니다.

select A.docid -- edited - I left out the A. :(
from A 
join B on B.docid = A.docid; 

매우 신속하게 실행되어야하며 "IN"쿼리와 동일한 결과를 얻을 수 있습니다.

+0

넣어야합니다 'select docid'에 대한 별칭은 A.docid를 선택하십시오. – ajreal

+0

Bohenian, 그 질문에서 distinct를 사용했기 때문에 제 질문을 편집했습니다. "B에서 select distinct (docid)"를 실행하면 0.07 초 밖에 걸리지 않고 IN 쿼리에서 33 초가 걸리는 이유는 무엇입니까? – Kunal

+0

... 별도의 쿼리가 기본 키 인덱스를 사용하여 일치하는 행을 찾을 수 있기 때문에 하위 쿼리가 B의 하위 쿼리에있는 모든 일치하는 행이 A와 일치하는 "for 루프"처럼 실행될 수 있기 때문에 JOIN이 현재 MySQL에서 최적화되어 있습니다. http://technocation.org/content/oursql-episode-29%3A-subpar-subqueries와 MySQL 매뉴얼 http://dev.mysql.com/doc/refman/5.5/en/optimizing-subqueries.html – eimaj