LIMIT/OFFSET при глубокой странице заставляет найти и отбросить много предыдущих строк. Для последовательной навигации эффективнее keyset-пагинация по последнему ключу и подходящий индекс.
Как была реализована пагинация на бэкенде? Почему LIMIT/OFFSET плохо работает на большом количестве записей? Как это можно оптимизировать?
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. Для стабильного снимка при изменениях данных нужна дополнительная договорённость о консистентности.