Подзапросы против объединений - PullRequest
155 голосов
/ 26 сентября 2008

Я рефакторил медленный раздел приложения, которое мы унаследовали от другой компании, чтобы использовать внутреннее соединение вместо подзапроса, подобного

where id in (select id from ... )

Реорганизованный запрос выполняется примерно в 100 раз быстрее. (от ~ 50 секунд до ~ 0,3) Я ожидал улучшения, но кто-нибудь может объяснить, почему он был таким радикальным? Все столбцы, использованные в предложении where, были проиндексированы. SQL выполняет запрос в предложении where один раз за строку или что-то в этом роде?

Обновление - Объяснить результаты:

Разница во второй части запроса "where id in ()" -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

против 1 индексированной строки с объединением:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

Ответы [ 14 ]

3 голосов
/ 26 сентября 2008

Посмотрите на план запроса для каждого запроса.

Где в и Присоединение может обычно быть реализовано с использованием того же плана выполнения, поэтому обычно ускорение с нуля переключаясь между ними.

2 голосов
/ 20 сентября 2016

Взято из справочного руководства ( 14.2.10.11 Перезапись подзапросов как объединений ):

LEFT [OUTER] JOIN может быть быстрее, чем эквивалентный подзапрос, потому что сервер мог бы оптимизировать его лучше - факт, который не относится только к MySQL Server.

Таким образом, подзапросы могут быть медленнее, чем LEFT [OUTER] JOINS.

2 голосов
/ 26 сентября 2008

Это не столько подзапрос, сколько предложение IN, хотя объединения лежат в основе по крайней мере механизма SQL Oracle и работают очень быстро.

2 голосов
/ 26 сентября 2008

В подзапросе необходимо повторно выполнить 2-й SELECT для каждого результата, и каждое выполнение обычно возвращает 1 строку.

При объединении 2nd SELECT возвращает намного больше строк, но вам нужно выполнить его только один раз. Преимущество состоит в том, что теперь вы можете присоединиться к результатам, а объединение отношений - это то, что база данных должна быть хороша. Например, возможно, оптимизатор может определить, как лучше использовать индекс сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...