Почему OFFSET плох
OFFSET заставляет базу пропускать все предыдущие строки (10000 записей), даже если они не нужны. При глубине 1 млн строк производительность катастрофична.Пагинация на основе курсора
Вместо
OFFSET запрос использует условие на индексированное поле, по которому идёт сортировка, например:SELECT * FROM news WHERE created_at < last_seen_date ORDER BY created_at DESC LIMIT 10.Переменная
last_seen_date — значение из последней записи предыдущей страницы. Это называется keyset pagination или seek method.Преимущества
База сканирует только нужные строки + ограниченный диапазон.
Работает за O(логарифм) по индексу.
Не зависает на больших смещениях.
Требования
Индекс на поле сортировки (например,
created_at).Уникальный вторичный ключ для разрешения связей (добавить
id в ORDER BY).Реальный пример
Twitter и Reddit используют курсоры для бесконечной ленты.
Вывод
Аналитик должен потребовать использования курсора вместо
OFFSET для любых бесконечных списков.