2015-03-02 3 views
0

Я написал запрос, и локально он работает нормально. Когда это жить я получаю эту ошибку:Как сделать мой mysql-запрос со многими левыми объединениями быстрее?

ERROR 1104: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

я добавил SET SQL_BIG_SELECTS=1;. Он работает сейчас, но работает очень медленно. Может ли кто-нибудь разобраться в моем запросе, ege вместо LEFT JOIN использует другой метод. Это мой запрос:

SELECT sh.*, 
     ps.provider_name, 
     ps.photo_path AS photo 
FROM scholarship sh 
     left join cat_category_sch ccs 
       ON ccs.scholar_id = sh.id 
     left join elg_countries_sch elg 
       ON elg.scholar_id = sh.id 
     left join study_level_sch sls 
       ON sls.scholar_id = sh.id 
     left join taken_country_sch tcs 
       ON tcs.scholar_id = sh.id 
     left join providers ps 
       ON ps.id = sh.provider 
     left join countires c1 
       ON c1.id = elg.county_id 
     left join countires c2 
       ON c1.id = tcs.county_id 
     left join study_level sl 
       ON sl.id = sls.study_level_id 
WHERE sh.status = 1 
     AND sh.ain_status = 1 
     AND sh.deadline >= Date_sub(Now(), interval 1 year) 
GROUP BY sh.id 
ORDER BY sh.id DESC 

Заранее спасибо

+0

Для начала ... последние три левого соединения кажутся вам нецелесообразными, вы не используете эти данные, поэтому вам не нужно их использовать. Это может улучшить время выполнения запроса. –

+1

Покажите нам структуры таблиц (с любыми индексами) и запустите EXPLAIN в отношении запроса, чтобы показать, как MySQL выполняет его. –

+0

Последнее 3 требуется также, потому что в некоторых случаях я использовал базу условий для этих таблиц, поэтому я помещаю это так: над запросом я удаляю некоторые условия. в каждой таблице я поддерживаю индекс (auto increment) как id –

ответ

0

ЛЕВЫЙ означает, что «право» таблица не может иметь строку «соответствия». Однако вы не проверяете наличие или отсутствие с IS NULL или NOT NULL. Итак, я подозреваю, что LEFT не нужно? (Я поднимаю вверх, потому что (1) он может отвлечься от реальной проблемы и (2) это может замедлить запрос.)

Если требуется LEFT, то ON tcs.scholar_id = sh.id нуждается в индексе на scholar_id. (И т. Д.)

Также может помочь комплексный индекс INDEX(status, ain_status, deadline).

+0

Благодарим вас за обновление, но я хочу получить –

+0

1. Добавьте индекс, который я предложил. 2. Опишите, почему вы использовали LEFT JOIN вместо JOIN. –

+0

спасибо @rick. в каждой таблице, имеющей индекс i.e. ** id ** (автоматически увеличивается). и я не знаю, какой из них лучше либо LEFT JOIN, либо JOIN –

Смежные вопросы