2010-01-04 2 views
-1

다음 필드가있는 세 개의 테이블이 있습니다.이러한 쿼리 중 성능이 우수한 쿼리는 무엇입니까?

클래스 : class_id | 이름 | 학년

classes_students : class_id | student_id

학생 : student_id | 이름

클래스에는 학생과 n : m 관계가 있으므로 한 클래스에는 많은 학생이 있고 한 학생에게는 여러 클래스를들을 수 있습니다. class_id가 5 인 특정 클래스의 모든 학생을 선택하고 싶습니다.

다음과 같은 세 가지 쿼리가 있습니다. MySQL 최신 버전 인 InnoDB 엔진을 사용합니다. 어느 것이 더 나은 성능을 보여줄 것이며 그 이유는 무엇입니까?

쿼리 A)

SELECT s.name 
    FROM students s 
    JOIN classes_students cs ON cs.student_id = s.student_id AND cs.class_id = 5 

쿼리 B)

SELECT s.name 
    FROM students s 
    JOIN classes_students cs ON cs.student_id = s.student_id 
    JOIN classes c ON c.class_id = cs.class_id 
WHERE c.class_id = 5 

쿼리 C)

SELECT s.name 
FROM students s 
INNER JOIN classes_students cs ON cs.student_id = s.student_id 
WHERE cs.class_id = 5 
+0

제안 된 쿼리에 대한 쿼리 계획에 중요한 차이가 없을 것입니다. 그러나 C는 쿼리가 수행하는 것을 표현하는 가장 자연스러운 방법입니다. 그걸로가. – bobince

+0

나는이 질문을 downvoted했습니다. OP 설정은 테스트입니까? OP가 더 나은 성능을 나타내는 이유는 무엇입니까? –

답변

1

는 MySQL은 EXPLAIN 문 것이다 상세 당신 실행 계획을 제공합니다 (아마 같은 실행 계획에 최적화됩니다).

나는 그것을 실행하지 않았지만 세 가지 쿼리가 정확히 동일한 방식으로 처리된다는 것이 틀림 없습니다.

MySQL 옵티 마이저를 조정해야 할 경우 STRAIGHT_JOIN 연산자를 사용할 수 있지만 일반적으로 MySQL은 상당히 영리합니다.

3

알 수있는 유일하고 진정한 방법은 마에입니다 이 모든 것을 수행하고 사용자 환경의 성능을 비교하십시오. 환경에 대해 항상 쿼리를 테스트하고 벤치마킹하여 실제로 그렇지 않은 경우를 알지 못해 실제로 어떤 것이 효과적인지 확인하십시오.

일반적으로 말하자면 모든 색인이 제 위치에 있다고 가정 할 때 더 많은 JOIN/관련 표가 있으므로 B가 최악이라고 기대합니다. A와 C 나도 같은 것으로 기대

관련 문제