Назад к вопросам
Senior
5
Как реализовать пагинацию в API? Проблема с OFFSET в PostgreSQL и альтернативы (cursor-based pagination)?
Компании, где спрашивали
платформа офд
Ответ от нейросети
sobes.tech AI
Пагинация в API нужна для ограничения объёма данных, возвращаемых за один запрос. Часто используется OFFSET в SQL, например:
SELECT * FROM items ORDER BY id LIMIT 10 OFFSET 100;
Но OFFSET имеет проблемы:
- При больших значениях OFFSET запросы становятся медленнее, так как база должна пропустить много строк.
- При изменении данных между запросами возможны пропуски или дублирование записей.
Альтернатива — cursor-based pagination (пагинация на основе курсора):
Вместо смещения передаётся значение последнего полученного элемента (например, id или timestamp). Запрос выглядит так:
SELECT * FROM items WHERE id > :last_id ORDER BY id LIMIT 10;
Преимущества:
- Быстрее при больших объёмах данных.
- Более стабильна при изменении данных (нет пропусков и дубликатов).
Недостаток — сложнее реализовать и поддерживать, особенно если сортировка сложная.
В Java API можно реализовать передачу курсора как параметра запроса, например ?after=12345&limit=10.