OFFSET выглядит удобно для страниц, но база всё равно должна просканировать и пропустить все предыдущие строки. Поэтому чем дальше страница, тем медленнее запрос:OFFSET 100000
Даже если вы не видите эти строки, СУБД всё равно читает их из индекса или таблицы, поэтому время выполнения растёт вместе с
OFFSET:SELECT *
FROM orders
WHERE id > :last_seen_id
ORDER BY id
LIMIT 10;
Эффективнее использовать
keyset-pagination — продолжать выборку от последнего значения ключа, а не пропускать строки:WHERE id > :last_seen_id
:last_seen_id — это id последней строки предыдущей страницы.Такой запрос использует индекс напрямую (если id индексирован, обычно это PK), поэтому работает одинаково быстро на первой и на миллионной странице.
Если сортировка не уникальная (например
created_at), добавляйте tie-breaker:ORDER BY created_at, id
WHERE (created_at, id) > (:last_seen_created_at, :last_seen_id)
🔥 Такой подход широко используется в больших системах: API, лентах событий, лог-системах и бесконечных скроллах.
➡️ SQL Ready | #совет
