Выбор ответа Middle Разборы систем обновлено

Пагинация ленты

Вопрос

Почему для бесконечной ленты используют пагинацию курсором, а не LIMIT 20 OFFSET 400?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Курсор не даёт дублей и не сканирует пропущенные строки. При OFFSET новые посты сверху сдвигают выдачу, и пользователь видит дубли или пропуски; к тому же БД всё равно читает и отбрасывает пропущенные строки, и чем глубже, тем дороже.

Варианты ответа

  1. Курсор не даёт дублей и не сканирует пропущенные строкиправильный ответ
  2. OFFSET не поддерживается в PostgreSQL 16 для больших таблиц
  3. Курсор позволяет перейти сразу на страницу 50 без запроса
  4. OFFSET возвращает строки в случайном порядке без индекса

Разбор

При OFFSET новые посты сверху сдвигают выдачу, и пользователь видит дубли или пропуски; к тому же БД всё равно читает и отбрасывает пропущенные строки, и чем глубже, тем дороже. Курсор «дай 20 постов старше X» стабилен и идёт по индексу. OFFSET в PostgreSQL есть, порядок задаётся ORDER BY, а прыжок на произвольную страницу как раз неудобен с курсором.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.