Классическая пагинация LIMIT 20 OFFSET 100000 — это тихий убийца производительности. Чтобы вернуть 20 записей с 100-й страницы, СУБД вынуждена прочитать и отбросить 100 000 предшествующих строк. Чем дальше листает пользователь, тем медленнее отвечает API.
💡 Решение: Keyset (Cursor-based) пагинация
-- ❌ Плохо (O(N) по времени):
SELECT id, title FROM posts ORDER BY created_at DESC LIMIT 20 OFFSET 100000;
-- ✅ Быстро (O(1) по индексу):
SELECT id, title FROM posts
WHERE id < :last_seen_id
ORDER BY id DESC
LIMIT 20;