Почему order by ускоряет запрос?

select `id`
from `posts`
where `posts`.`created_at` >= '2016-01-24'
and `is_duplicate` = 0
and `deleted` is null
and exists (select 1 from `entity_user` where `entity_user`.`user_id` = 2 and `entity_user`.`entity_id` = `posts`.`entity_id`) 
limit 20

Вот такой код выдает в explain 2 миллиона строк в поле rows, а если добавить сортировку, то 20
select `id`
from `posts`
where `posts`.`created_at` >= '2016-01-24'
and `is_duplicate` = 0
and `deleted` is null
and exists (select 1 from `entity_user` where `entity_user`.`user_id` = 2 and `entity_user`.`entity_id` = `posts`.`entity_id`) 
order by `posts`.`created_at` desc 
limit 20

Индекс используется вот такой created_at_post_type_is_duplicate_deleted.
Почему так происходит? Везде всегда пишут, что сортировка замедляет запрос, а тут получается ускоряет?
  • Вопрос задан
  • 2103 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Почему так происходит?
1. Потому, что выводится в результате меньше ровно на (2 000 000 - 20) записей.
Или, другими словами, диапазон: 1 999 980 ... 2 000 000
2. Обратная сортировка 'desc' - смотрит в диапазоне от >='2016-01-24' до последней (самой новой) даты и сортировку этого списка - реверсирует, чтобы начать перебор с конца, поэтому кол-во просматриваемых записей - тут НЕСОИЗМЕРИМО! меньше и из-за этого запрос работает быстрее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
romy4
@romy4
Exception handler
Не ускоряет запрос. В первом случае какие ключи используются, а во втором?
Ответ написан
Ваш ответ на вопрос

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

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