Ответ 1
Подзапросы обычно хороши, если они не являются зависимыми подзапросами (также называемыми коррелированными подзапросами). Если вы используете только независимые подзапросы и используете соответствующие индексы, они должны запускаться быстро. Если у вас есть зависимый подзапрос, вы можете столкнуться с проблемами производительности, потому что зависимый подзапрос обычно должен выполняться один раз для каждой строки во внешнем запросе. Поэтому, если ваш внешний запрос имеет 1000 строк, подзапрос будет выполняться 1000 раз. С другой стороны, независимый подзапрос обычно нужно оценивать только один раз.
Если вы не знаете, что подразумевается под зависимым или независимым вложенным подзапросом здесь, это правило - если вы можете взять подзапрос, удалить его из своего контекста, запустить его и получить набор результатов, тогда он independent subquery
.
Если вы получите синтаксическую ошибку, потому что она относится к некоторым таблицам вне подзапроса, тогда ее a dependent subquery
.
Общее правило, конечно, имеет несколько исключений. Например:
- Многие оптимизаторы могут использовать зависимый подзапрос и найти способ эффективно его запускать как JOIN. Например, запрос NOT EXISTS может привести к плану запроса ANTI JOIN, поэтому он не обязательно будет медленнее, чем запись запроса с помощью JOIN.
- MySQL имеет bug, где независимый подзапрос внутри выражения IN неправильно идентифицируется как зависимый подзапрос, и поэтому субоптимальный план запроса используемый. Это, по-видимому, исправлено в самых новых версиях MySQL.
Если производительность является проблемой, то измерьте ваши конкретные запросы и посмотрите, что лучше всего подходит вам.