← Все вопросы

Как сделать пагинацию в SQL через LIMIT и OFFSET?

Задан 5 месяцев назад699 просмотров2 ответа
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 месяца назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект