2016-10-02 2 views
1

갖는 문제의 원인, 행 만 반환합니다.하위 쿼리는 다음과 같이 하위 쿼리를 만드는 느린

SELECT ser_id FROM history WHERE his_status=2 

그것은 단지 0.5 초에서 작동 : 난 단지 서브 쿼리를 실행하면

. 이 하위 쿼리에는 50,000 개의 레코드가 있습니다.

어떤 방법으로 이것을 최적화 할 수 있습니까? 고맙습니다.

+2

갖는 인덱스 첫째와'his_status' 도움이 될이 두 SQL을 비교합니다. 아마도 '존재하지 않음'또는 '외부 조인/널'이 더 빠를 것입니다. 일반적으로 성능 관련 질문이있을뿐입니다. – sgeddes

답변

2

대신 NOT EXISTS을 사용해보세요.

SELECT s.ser_id 
FROM service s 
WHERE NOT EXISTS (
    SELECT 1 
    FROM history h 
    WHERE h.his_status = 2 
    AND h.ser_id = s.ser_id 
) 

실제 차이를 볼 수 있지만 EXPLAIN 계획을 시도를 처리 할 때이 쿼리 속도를해야 행의 "큰"금액은 하위 쿼리 자체 내에서 들었다.

0

먼저 색인을 만들어야합니다.

CREATE INDEX ser_id__index ON service (ser_id); 
CREATE INDEX his_status__index ON history (his_status); 

그런 다음

ser_id``에

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT ser_id FROM history WHERE his_status=2); 

둘째

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT DISTINCT ser_id FROM history WHERE his_status=2);