Цитата |
А можете обьяснить почему не вариант? |
Могу. Дело в том, что запросы с подзапросами выполняются отнюдь не в том порядке, в котором это представляется на первый взгляд. Не так, как казалось бы логичным.
Как это казалось бы должно делаться:
сначала отработал вложенный запрос. мускл где-то запомнил, что он там отработал, а потом подставил просто в запрос, в котором вызывается это вложенный.
Вывод: неплохая производительность, несмотря на то что фактически выполняется два запроса. выполняются они сразу и без дополнительного обращения к серверу.
Как это делается на самом деле:
Сначала отрабатывает основной запрос. Для каждой строки его результата выполняется вложенный. И совершенно не зависит нужно это или нет. Зависимость количества вложенных запросов от количества записей в результате линейна.
Вывод: производительность куда хуже. Запросов вовсе даже не два получается, гораздо больше. Считай - 20 записей - 21 запрос. Это конечно, надо понимать, что обращение к базе всего одно, и при небольшой нагрузке запрос выполнится достаточно быстро.
А вообще, чтобы стало понятно, выполни два запроса на любой таблице с количеством записей хотя бы 10000:
SQL |
select * from `table`; |
SQL |
select * from (select * from `table`) sel; |
и сравни разницу в скорости.
А лучше используй explain - он наглядно покажет в чем разница между ними.