2013-04-18 4 views
0

G 일,MYSQL 하위 쿼리 성능 불일치

나는 다음과 같이 다소 의아해합니다.

Select * 
from test 
where id in (select id from test2 where customer = 'HARRY'); 

나는 침 초에 '13454'으로는 해결 자체 하위 쿼리를 실행할 때 :이 쿼리를 실행하면 는 그것을 해결하기 위해 매우 오랜 시간이 걸립니다. 기본 쿼리의 where 문을 ('13454')로 변경하면 즉시 해결됩니다.

누군가 원래의 형식으로 실행되지 않는 이유는 무엇입니까?

건배,

르네

답변

1

이유는 MySQL의 특징입니다. 부속 테이블은 외부 테이블의 각 행에 대해 실행됩니다.

이 문제를 해결하려면, exists을 사용하면 test2(customer, id)에 인덱스가있는 경우

Select * 
from test 
where exists (select id from test2 where test2.customer = 'HARRY' and test2.id = test.id); 

이 가장 효율적으로 작동합니다.

이 내용은 MySQL 버전에 따라 달라진다는 것을 추가해야합니다 (5.5 버전에서 수정 된 것 같습니다).

다음과 같은 하위 쿼리 비교 고려하십시오 : documentation 나이는로 설명합니다. "내부 외부에"

MySQL의 쿼리를 평가 (subquery_where이 곳에서 ... inner_expr 선택)

IN outer_expr 수식을 즉, 외부 표현식 outer_expr의 값을 먼저 으로 얻은 다음 하위 쿼리를 실행하고 생성 된 행을 캡처합니다.

+0

v5.6으로 업그레이드되었습니다. 모두 좋다! – user2081876

0

빠른 성능을 위해 사용 JOIN

SELECT DISTINCT a.* 
FROM Test a 
     INNER JOIN Test2 b 
      ON a.ID = b.ID 
WHERE b.customer = 'Harry' 

, 두 테이블에 ID이 그들에 KEY이 있는지 확인하십시오.