Почему подвыбор замедляет выполнение SQL-запроса?
У меня есть следующий код:
select
*
from
table_1
join
table_2
on
table_1.col1 = table_2.col1
where
table_2.col2 = 1
Этот запрос работает и дает мне ожидаемые результаты. Теперь я хотел бы оптимизировать этот запрос. Идея состоит в том, что я пытаюсь уменьшить второй запрос до объединения двух таблиц. Другими словами, я предполагаю, что "удаление" строк и присоединение к меньшим таблицам должно быть быстрее, чем присоединение к большим таблицам и затем выбор из них того, что мне нужно. Я реализую свою идею следующим образом:
select
*
from
table_1
join
(
select
*
from
table_2
where
table_2.col2 = 1
)
on
table_1.col1 = table_2.col1
Удивительно, но второй запрос значительно медленнее, чем первый. Что я делаю неправильно?
1 ответ
Вы можете увидеть разницу в плане выполнения запроса.
Без плана я могу только предположить: в вашем первом примере у вас есть 2 таблицы. Оптимизатор Mysql имеет некоторую статистику данных и может правильно выбирать и использовать индекс.
Во втором запросе у вас нет таблицы, только результат запроса и оптимизатор не имеют статистики данных. Может быть, в вашем случае оптимизатор выполнит запрос без индекса или что-то в этом роде.
Я думаю, подзапрос в вашем случае, это плохая практика. У вас есть простой запрос, вы должны использовать свой первый пример.