← Все вопросы
Как сделать пагинацию в SQL через LIMIT и OFFSET?
15
Вывожу список заказов постранично по 20 штук. Первая страница понятна — LIMIT 20. А как взять вторую, третью страницу? И есть ли подводные камни у этого подхода?
2 ответа
26
OFFSET пропускает N строк, LIMIT берёт следующие. Формула: OFFSET = (номер_страницы - 1) * размер.
-- страница 3, по 20 на странице
SELECT * FROM orders
ORDER BY id
LIMIT 20 OFFSET 40;
Критично: пагинация без ORDER BY бессмысленна — порядок строк не гарантирован, и одна и та же запись может прыгать между страницами. Сортировка должна быть стабильной (например по уникальному id).
16
Подводный камень: большой OFFSET тормозит — БД всё равно читает и пропускает все предыдущие строки. На «странице 5000» это уже больно. Для глубоких списков делают keyset-пагинацию: WHERE id > последний_id_прошлой_страницы ORDER BY id LIMIT 20.
Кирилл Борисов keyset ещё называют seek-методом, гуглить по этому слову · 4 месяца назад
Ваш ответ
Войдите, чтобы ответить на вопрос.