Senior
42
¿Cómo implementar la paginación en una API? Problemas con OFFSET en PostgreSQL y alternativas (paginación basada en cursor)?
Empresas donde se preguntó
платформа офд
Respuesta de la IA
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.