2013-10-11 1 views
0

특정 언어를 구사하는 교사를 찾고 유효한 위치에 미래의 가용성이 있거나 선생님의 기본 위치에 자리를 비울 필요가 없습니다. 여러 명의 교사가 같은 위치에있을 수 있습니다. 이 쿼리는 작동하지만 매우 느립니다. 어떤 색인을 사용해야합니까?이 느린 다중 쿼리에 어떤 인덱스를 추가해야합니까?

Select 
    teachers.teacher_id, 
    teacherLocations.location_id 
From 
    tdb_teachers AS teachers 
Join 
    tdb_teacher_languages As teacherLanguages 
    On teacherLanguages.teacher_id = teachers.teacher_id And 
     teacherLanguages.language_id = 33 
Left Join 
    tdb_availability As locAvail 
    On locAvail.teacher_id = teachers.teacher_id And 
     locAvail.end_date >= 1381449600 
Join 
    tdb_locations AS teacherLocations 
    On (
     teacherLocations.location_id = locAvail.location_id Or 
     teacherLocations.location_id = teachers.location_id 
    ) And 
    teacherLocations.latitude != "" And 
    teacherLocations.longitude != "" 
+1

인덱스가 조인 된 항목이나 where 절 (대부분의 경우) 내에있는 지 항상 확인해야합니다. – JonH

+0

조인의 조건을 제거하고'WHERE' 절을 사용하십시오. – JonH

+0

병목 현상을 알아 내기 위해 EXPLAIN을 시도 했습니까? –

답변

1

전나무이 당신에게 더 나은 결과를 얻을 수 있는지보십시오

Select 
    teachers.teacher_id, 
    teacherLocations.location_id 
From 
    tdb_teachers AS teachers 
Join 
    tdb_teacher_languages As teacherLanguages 
    On teacherLanguages.teacher_id = teachers.teacher_id 
Left Join 
    tdb_availability As locAvail 
    On locAvail.teacher_id = teachers.teacher_id And 
Join 
    tdb_locations AS teacherLocations 
    On (
     teacherLocations.location_id = locAvail.location_id Or 
     teacherLocations.location_id = teachers.location_id 
    ) 
WHERE 
    teacherLocations.latitude != "" 
    And teacherLocations.longitude != "" 
    AND locAvail.end_date >= 1381449600 
    And teacherLanguages.language_id = 33 

이 그런 다음 null 이외의 필드에 인덱스를 추가, tdb_teacher_languages.end_date 및 tdb_teacher_languages.language_id 최선의 후보처럼 보인다. 그런 다음 여기에 설명 계획을 붙여 넣을 수 있습니다.

+0

조인 대신 트릭을 수행하는 논리로 이동. 감사! – Citizen

관련 문제