2011-11-29 3 views
1

이 쿼리는 실행하는 데 4 ~ 5 초가 걸렸습니다. 여기 내 테이블 통계는 다음과 같습니다영원히 복용하지 않는 MySQL

학생들이 테이블 :

SELECT students.student_id 
FROM students 
WHERE students.grade_level ='12' 
AND students.student_id 
NOT IN (
    SELECT idtrack.student_id 
    FROM idtrack 
    WHERE idtrack.event_id ='33' 
) 

지금이 쿼리를 완료하는 데 30 초 걸리는 : 4200 행

idtrack 표 15000 행

여기

와 나의 쿼리입니다 . 누군가가 내게 최적화/리팩터링 도와 드릴까요? 미리 감사드립니다.

+2

하위 쿼리는 항상 시간이 걸리므로 인덱스가 있고 쿼리의 실행 계획을 확인하십시오. –

+0

테이블 스키마를 게시하는 것이 좋습니다. –

답변

0

어쩌면 테이블에 대한 기본 kays 만들기를 잊었을까요?

+0

모든 테이블에 기본 키가 있습니다. –

+0

바인드 된 필드'students.student_id'' idtrack.event_id'에 인덱스를 생성하는 것이 바람직합니다 – triclosan

0

EXISTS은 보통 NOT EXISTS 절과 모순되는 idtrack의 레코드를 찾으면 MySQL이 단락 될 수 있기 때문에 훨씬 빠릅니다.

SELECT students.student_id 
FROM students 
WHERE students.grade_level ='12' 
AND NOT EXISTS (
SELECT idtrack.student_id 
FROM idtrack 
WHERE idtrack.event_id ='33' 
AND idtrack.student_id = students.student_id 
) 
+0

고유 한 인덱스 필드에 4 : 1 비율을 사용합니까? 나는 아주 놀랄 것입니다. – symcbean

+0

@symcbean : 각 테이블의 레코드 수를 확인하지 못했습니다. – flesk

0

어떤 약은 "여기서 students.grade_level = 12> (33) <을 idtrack.event_id"idtrack에 학생들을 참여하고, 필터? Join은 하위 쿼리보다 빠릅니다. 단순 균등/불평등 "not in"보다 빠릅니다.

1

또한 테이블 명령을 생성하고 출력을 그 오히려 어려운 설명 보지 않고

SELECT students.student_id 
FROM students 
LEFT JOIN idtrack ON idtrack.event_id='33' AND idtrack.student_id = students.student_id 
WHERE students.grade_level ='12' 
AND idtrack.student_id IS NULL 
+0

나는 이것을 시도했지만 여전히 느린 결과를 받고 있었다. 나는 PHP와 배열 intesect 그것을하고 결국! 감사! –

0

을 시도 할 수 있습니다. 하지만 당신은 시도 할 수 있습니다 :

SELECT students.student_id 
FROM students LEFT JOIN idtrack 
    ON students.id=idtrack.student_id 
    AND idtrack.event_id ='33' 
WHERE students.grade_level ='12' 
AND idtrack.student_id IS NULL 

은 idtrack.event_id 및 students.grade_level이 숫자로 선언 BTW 경우 다음 그들은

을 인용해서는 안된다.