Sobes.tech
Назад к вопросам
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.