Получить доступ

Почему keyset-пагинация (seek) обычно лучше OFFSET-пагинации на больших таблицах?

MiddleОптимизация запросовSQL
Ещё спрашивают так:
  • Что такое seek-пагинация?
Коротко

OFFSET читает и выбрасывает все пропускаемые строки — глубокие страницы дорогие. Keyset продолжает с последнего показанного значения по индексу — стоимость почти постоянна.

  • WHERE (created_at, id) < (:ts, :id) ORDER BY created_at DESC, id DESC LIMIT 20
  • Нужен составной индекс и уникальный тайбрейкер
  • Вставки не сдвигают страницы — нет дублей и пропусков

А ещё Нельзя перейти на произвольный номер страницы

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

LIMIT 20 OFFSET 100000 заставляет БД найти и отбросить 100000 строк перед выдачей 20 — стоимость глубокой страницы линейно растёт. Keyset (seek-метод) запоминает значение сортировки последней строки и просит WHERE (created_at, id) < (:lastTs, :lastId) ORDER BY ... LIMIT 20 — это попадает в индекс и не зависит от глубины. Минусы keyset: нельзя прыгнуть на произвольную страницу по номеру и нужен стабильный уникальный порядок (поэтому добавляют tie-breaker по id). Для бесконечной прокрутки/больших списков берут keyset; OFFSET оставляют для мелких наборов и навигации по номерам.

Что хотят услышать

  • Почему OFFSET дорог на глубине.
  • Запрос keyset и нужный индекс.
  • Корректность при вставках и ограничение.

Частые ошибки

  • Использовать OFFSET для глубокой пагинации больших таблиц.
  • Делать keyset без уникального tie-breaker — пропуски/дубли при равных значениях.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓OFFSET заставляет БД пройти и отбросить все пропускаемые строки (растёт с номером страницы), а keyset продолжает по значению из индекса (WHERE id > :last) с почти постоянной стоимостью
  • ✗OFFSET вообще не использует индексы, а keyset использует
  • ✗Keyset возвращает строки в случайном порядке, поэтому быстрее
  • ✗Разницы нет, OFFSET просто старее

Что спросят дальше

  • Зачем keyset нужен tie-breaker по id?
  • Почему по keyset нельзя прыгнуть на страницу N?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем