2013-10-11 9 views
0

Мне нужно найти учителей, говорящих на определенном языке, и иметь доступность в будущем в правильном месте или в исходном местоположении учителя, для которого не требуется наличие доступности. Несколько учителей могут находиться в одном месте. Этот запрос работает, но очень медленный. Какие индексы я должен использовать?Какие индексы следует добавить для этого медленного запроса на соединение mulitple?

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 

Затем добавить индексы на полях, не являющихся нулевыми, выглядит как tdb_teacher_languages.end_date и tdb_teacher_languages.language_id ваши лучшие кандидаты. После этого вы можете попробовать вставить здесь план объяснений.

+0

Перемещение логики туда, где вместо соединений делало трюк. Благодаря! – Citizen