2010-08-10 4 views
0

NOT IN을 사용하여 약 100,000 개의 행이있는 테이블에서 아래의 쿼리를 실행하고 있는데 성능이 좋지 않습니다. 동일한 결과를 얻는 또 다른 방법이 있습니까?MySql NOT IN 성능 문제

SELECT c.Id, c.Name, c.address, c.town, 
c.county, c.postcode, FROM contractor AS c 
inner join Order w 
on w.Id = c.Id WHERE (c.valid = 1) and c.Id not in 
(select w.Id from Order w) ORDER BY c.Name ASC 

감사

+1

이 쿼리는 어떠한 행도 반환하지 않습니다. 당신의 조인은 오직 c를 얻을 수 있습니다. 그게 w와 같습니다. 그럴 것입니다. (그러므로 w를 선택합니다. w로부터 왔습니다.) 또한 구문 오류 (c.postcode 다음의 ',')가 있습니다. –

답변

0

나는 개인적으로 당신이 당신의 필드에 색인을 추가 할 수 있습니다 것을 제외하고는 코드에 더 개선을 볼 수 없습니다. 일반적인 규칙은 WHERE 절에서 사용하는 열에 인덱스를 추가하는 것입니다.

2

중복 내부 결합이 Order 인 것 같습니다.
다음 쿼리는 동일한 결과를 산출하고 성능을 향상시킬 수 있다고 생각합니다.

SELECT c.Id 
     , c.Name 
     , c.address 
     , c.town 
     , c.county 
     , c.postcode 
FROM contractor AS c 
     left outer join Order w on w.Id = c.Id 
WHERE (c.valid = 1) 
     and w.Id IS NULL 
ORDER BY 
     c.Name ASC 
+0

이것이 TS가 원했던 것 같아 +1. –

+0

안녕하세요, 귀하의 제안에 감사드립니다. 불행히도 그것은 (2 ~ 3 분) 내가 말하는대로 아직도 실행 중입니다 ... 존재하지 않는 것을 사용할 수있는 방법이 있습니까? – user357535

+1

열을 인덱싱하지 않았기 때문에 속도가 느릴 수 있습니다. c.Id와 w.Id 열에 색인을 붙여 놓으면 좋을 것입니다. –