В чём принципиальная разница двух запросов?

SELECT * FROM (
    SELECT MAX(c5_.id) AS sclr_32 FROM contacts_history c5_ 
    WHERE (c5_.organization_id = '1') GROUP BY c5_.contact_id
) tt 
JOIN contacts_history ch ON tt.sclr_32 = ch.id;

SELECT * FROM contacts_history WHERE id IN (
    SELECT MAX(c5_.id) AS sclr_32 FROM contacts_history c5_ WHERE (c5_.organization_id = '1') GROUP BY c5_.contact_id
);


Какой из запросов будет иметь большую деградацию по мере роста количества данных.
  • Вопрос задан
  • 774 просмотра
Пригласить эксперта
Ответы на вопрос 3
SagePtr
@SagePtr
Еда - это святое
Вместо того, чтобы гадать, можно посмотреть explain обоих запросов.
В крайнем случае, сгенерировать тестовые данные и забить в таблицы, измерить после этого с отключённым кэшем запросов.
Ответ написан
@ComodoHacker
Принципиальной разницы нет.
Ответ написан
@grebenyukov
Будет разным количество столбцов, т.к. в первом случае select * производится из (подзапрос tt join таблица contacts_history), а во втором случае - только из таблицы contacts_history. То есть, в первом варианте будет плюс поле sclr_32.
По производительности мне эмпирически больше нравится первый вариант, но как выше правильно написал SagePtr, надо смотреть план, причем с реалистичным количеством строк и соотношением количества строк к количеству уникальных значений поля contacts_history.contact_id.
А если рассматривать применение подобных запросов на практике, то возможно, он еще будет обернут в select * from (...) limit xx offset yyy; Тогда и анализ надо будет проводить относительно полного текста. И тут мне кажется. первый вариант быстрее выдаст первые xx строк.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы