Почему подвыбор замедляет выполнение 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 имеет некоторую статистику данных и может правильно выбирать и использовать индекс.

Во втором запросе у вас нет таблицы, только результат запроса и оптимизатор не имеют статистики данных. Может быть, в вашем случае оптимизатор выполнит запрос без индекса или что-то в этом роде.

Я думаю, подзапрос в вашем случае, это плохая практика. У вас есть простой запрос, вы должны использовать свой первый пример.

Другие вопросы по тегам