Почему keyset-пагинация (seek) обычно лучше OFFSET-пагинации на больших таблицах?
- Что такое seek-пагинация?
OFFSET читает и выбрасывает все пропускаемые строки — глубокие страницы дорогие. Keyset продолжает с последнего показанного значения по индексу — стоимость почти постоянна.
WHERE (created_at, id) < (:ts, :id) ORDER BY created_at DESC, id DESC LIMIT 20- Нужен составной индекс и уникальный тайбрейкер
- Вставки не сдвигают страницы — нет дублей и пропусков
А ещё Нельзя перейти на произвольный номер страницы
Подробно
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 — пропуски/дубли при равных значениях.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Keyset возвращает строки в случайном порядке, поэтому быстрее
- ✗Разницы нет, OFFSET просто старее
- ✓OFFSET читает и отбрасывает все пропущенные строки, а keyset сразу продолжает с ключа по индексу
- ✗OFFSET вообще не использует индексы, а keyset читает только индекс без таблицы
Что спросят дальше
- Зачем keyset нужен tie-breaker по id?
- Почему по keyset нельзя прыгнуть на страницу N?
Разбор темы
- Практика оптимизации запросов
EXPLAIN и чтение плана, порядок колонок индекса, keyset-пагинация и ловушки, мешающие индексу.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.