> Какие стратегии пагинации можно использовать вместо LIMIT OFFSET? (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: InDrive
Стек: Go
> Пример ответа
Вместо LIMIT OFFSET, которая становится неэффективной на больших смещениях (база данных всё равно сканирует все пропущенные строки), в Go-проектах часто применяют:
-
Cursor-based пагинация (keyset pagination) - использует уникальное сортируемое поле (например,
idилиcreated_at). ВместоOFFSETпередаётся значение последнего элемента предыдущей страницы. Пример запроса:SQLSELECT id, name, created_atFROM usersWHERE created_at < $1 -- или id < $1 для монотонного idORDER BY created_at DESCLIMIT $2В Go это реализуется передачей курсора (например, закодированного в base64) в параметрах запроса. Плюсы: константная скорость независимо от номера страницы, стабильность при вставках/удалениях. Минусы: сложнее реализовать произвольный переход на страницу.
-
Seek method - разновидность курсорной пагинации, где курсор - это составной ключ (например,
(rating, id)). Позволяет эффективно сортировать по нескольким полям:SQLSELECT * FROM productsWHERE (rating, id) < ($1, $2)ORDER BY rating DESC, id DESCLIMIT $3 -
Page-based с использованием индексов - если
OFFSETнеизбежен, можно хранить в кеше (Redis) маппинг "номер страницы → значение ключа для курсора" и пересчитывать его фоновыми задачами. -
Гибридный подход - для первых страниц использовать
LIMIT OFFSET(они дёшевы), а для глубоких - переключаться на курсорную пагинацию.
В Go удобно реализовать курсорную пагинацию через структуру:
GOtype Cursor struct {Value interface{} // последнее значение поля сортировкиIsAfter bool // направление}
И передавать её в репозиторий, который строит WHERE условие.
> Похожие задачи по Go
Приходилось ли менять уровни изоляции транзакций?
Что делать, если после добавления индекса селективность низкая и запрос остается медленным?
Что такое пагинация?
Зачем добавлять контекст в запросы к базе данных?
> Похожие задачи по backend
Приходилось ли менять уровни изоляции транзакций?
Что делать, если после добавления индекса селективность низкая и запрос остается медленным?
Что такое пагинация?
Зачем добавлять контекст в запросы к базе данных?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью