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