Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Пагинация
pagination

Пагинация

Пагинация с офсетом, курсорная и keyset-пагинация, бесконечный скролл

Пагинация

Пагинация — это процесс разделения большого набора данных на более мелкие, управляемые части (страницы), чтобы улучшить производительность и пользовательский опыт.

#Сравнение методов пагинации

МетодПроизводительностьСтабильность при измененияхСлучайный доступБесконечный скроллПример SQL
Offset-basedO(N) при больших offsetНизкая (дубликаты/пропуски)ДаНетSELECT * FROM posts LIMIT 10 OFFSET 100
Cursor-based (Keyset)O(1) с индексомВысокаяНет (только вперед)ДаSELECT * FROM posts WHERE id > 123 ORDER BY id ASC LIMIT 10
Page-basedO(1)СредняяДаНетSELECT * FROM posts WHERE page = 5
Time-basedO(1)ВысокаяОграниченныйДаSELECT * FROM logs WHERE created_at < '2024-01-01' ORDER BY created_at DESC LIMIT 10

#Основные подходы

  • Offset-based Pagination: Простота реализации, но плохая производительность на больших данных.
  • Cursor-based (Keyset) Pagination: Лучшая производительность и стабильность, идеально для бесконечного скролла.
  • Time-based Pagination: Используется для логов и временных данных.

#Практический пример: Реализация пагинации в API

REST API с cursor-based пагинацией:

GET /posts?cursor=123&limit=10

Ответ:

{ "data": [ { "id": 124, "title": "Post 124" }, { "id": 125, "title": "Post 125" } ], "pagination": { "next_cursor": "125", "has_more": true, "total_count": 1000 } }

Реализация на сервере (Node.js):

app.get('/posts', (req, res) => { const cursor = req.query.cursor || 0; const limit = parseInt(req.query.limit) || 10; const posts = db.posts .find({ id: { $gt: cursor } }) .sort({ id: 1 }) .limit(limit); const nextCursor = posts.length > 0 ? posts[posts.length - 1].id : null; res.json({ data: posts, pagination: { next_cursor: nextCursor, has_more: posts.length === limit, total_count: db.posts.count() } }); });

#Процесс выбора метода пагинации (по критериям)

КритерийРекомендуемый методОбоснование
Большие объемы данных (>100K записей)Cursor-basedO(1) производительность, стабильные результаты
Необходимость случайного доступа к страницамOffset-based или Page-basedТолько они поддерживают прямой переход по номеру страницы
Бесконечный скролл UICursor-basedЕстественная поддержка последовательной загрузки
Временные данные (логи, события)Time-basedЛогично по времени, а не по ID
Простота реализации для MVPOffset-basedМинимальная сложность, быстрая разработка

#Часто задаваемые вопросы (FAQ)

Q: В чём разница между пагинацией с офсетом и курсорной пагинацией? A: Офсет: LIMIT 10 OFFSET 100 — медленно на больших офсетах; Курсорная: WHERE id > last_id LIMIT 10 — быстро, но только прямая навигация.

Q: Какой тип пагинации лучше подходит для бесконечного скролла? A: Cursor-based — эффективная загрузка следующей порции по последнему ID. Это идеально подходит для бесконечного скролла, так как позволяет эффективно загружать следующую порцию данных, зная только последний ID или временную метку предыдущей порции.

Q: Какая основная проблема offset-based пагинации при работе с большими данными? A: O(N) сложность сканирования — СУБД пропускает записи линейно. При запросе OFFSET 1000000 СУБД должна пропустить первые миллион записей, что приводит к значительному замедлению.

Q: Что такое 'keyset pagination'? A: Keyset pagination — это другое название для cursor-based пагинации, где клиент передает значение ключа (обычно ID или временную метка) последней записи на предыдущей странице, и сервер выбирает записи, которые идут после него.

Выбор метода зависит от требований к производительности, объема данных и необходимой функциональности (например, возможность перехода на конкретную страницу).

Далее: Обработка ошибок