2012-11-30 5 views
3

약 100,000 개의 레코드 인 대용량 데이터 집합을 반환하는 복잡한 쿼리를 작성합니다. 내가 WHERE 절에이 OR 문에 추가 할 때까지 쿼리가 잘 실행 :where 문 최적화 MYSQL

AND (responses.StrategyFk = strategies.Id 또는 responses.StrategyFk이 IS NULL)

지금은에 의해 이해 거기에 or 문을 넣으면 많은 오버 헤드가 추가됩니다. 없이

그 진술 그냥 :

및 responses.StrategyFk = strategies.Id

쿼리 15 초 내에서 실행하지만,이 없었 모든 레코드를 반환하지 않습니다 전략을 연결하는 fk.

비록이 기록을 원하지만. 간단한 where 문으로 두 레코드를 쉽게 찾을 수 있습니까? Null 레코드에 대해 다른 AND 문을 추가 할 수는 없으므로 이전 문이 중단됩니다. 여기에서 어디로 가야할지 모를 정도.

내 쿼리의 하반부를 강조합니다.

FROM 
responses, subtestinstances, students, schools, items, 
strategies, subtests 

WHERE 
subtestinstances.Id = responses.SubtestInstanceFk 
AND subtestinstances.StudentFk = students.Id 
AND students.SchoolFk = schools.Id 
AND responses.ItemFk = items.Id 
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null) 
AND subtests.Id = subtestinstances.SubtestFk 

답변

2

시도 :

그것 뿐이다
SELECT ... FROM 
responses 
JOIN subtestinstances ON subtestinstances.Id = responses.SubtestInstanceFk 
JOIN students ON subtestinstances.StudentFk = students.Id 
JOIN schools ON students.SchoolFk = schools.Id 
JOIN items ON responses.ItemFk = items.Id 
JOIN subtests ON subtests.Id = subtestinstances.SubtestFk 
LEFT JOIN strategies ON responses.StrategyFk = strategies.Id 

. 이 경우 LEFT JOIN이 수행하는 OR 조건이 실제로 필요하지 않습니다. Anywhere responses.StrategyFk가 NULL이면 strategies 테이블과 일치하지 않으며 그 행을 반환합니다. 그 후 http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

여전히 성능 문제가 발생하는 경우 다음 당신은 EXPLAIN SELECT ... ; 출력보고 추가해야 할 수도 인덱스를 찾고 시작할 수 : 조인의

간단한 설명은이 링크를 참조하십시오. Optimizing Queries With Explain -- MySQL Manual

+0

Ahh 고마워요! 이것은 훨씬 더 효율적입니다. 이제부터는이 명시 적 조인 방법을 사용해야하는 것 같습니다. 정확히 – mmSQL

+0

; 다른 사람들이 당신이하고 싶은 것을 읽고 이해하는 것이 훨씬 쉽고 쉬워졌습니다. –

2

명시 적 JOIN의를 사용해보십시오 :

... 
FROM responses a 
     INNER JOIN subtestinstances b 
       ON b.id = a.subtestinstancefk 
     INNER JOIN students c 
       ON c.id = b.studentfk 
     INNER JOIN schools d 
       ON d.id = c.schoolfk 
     INNER JOIN items e 
       ON e.id = a.itemfk 
     INNER JOIN subtests f 
       ON f.id = b.subtestfk 
     LEFT JOIN strategies g 
       ON g.id = a.strategyfk 
+0

도움을 주셔서 감사합니다. – mmSQL