Как была реализована пагинация на бэкенде? Почему LIMIT/OFFSET плохо работает на большом количестве записей? Как это можно оптимизировать?

LIMIT/OFFSET при глубокой странице заставляет найти и отбросить много предыдущих строк. Для последовательной навигации эффективнее keyset-пагинация по последнему ключу и подходящий индекс.

Короткий ответ

Что ответить на собеседовании

LIMIT/OFFSET при глубокой странице заставляет найти и отбросить много предыдущих строк. Для последовательной навигации эффективнее keyset-пагинация по последнему ключу и подходящий индекс.

Подробный разбор

Ответ с пояснениями

LIMIT/OFFSET при глубокой странице заставляет найти и отбросить много предыдущих строк. Для последовательной навигации эффективнее keyset-пагинация по последнему ключу и подходящий индекс.

Например, при сортировке ORDER BY created_at DESC, id DESC следующую страницу выбирают условием (created_at, id) < (:last_time, :last_id) и LIMIT. Составной индекс с таким порядком помогает избежать большого OFFSET.

ID служит уникальным довеском для одинаковых дат. Курсор должен сохранять также фильтры и порядок; NULL требуют отдельной политики. Keyset удобен для «далее», но не даёт дешёвого произвольного перехода на страницу 500. Для стабильного снимка при изменениях данных нужна дополнительная договорённость о консистентности.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее