Viji
@Viji
DevOps Engineer

Используется ли пагинация в SQL запросах?

есть сложный sql запрос, со многими joints, типа

SELECT
    customer.id AS customer_id,
    customer.name,
    order.id AS order_id,
    order.product_id
FROM
    customer
LEFT JOIN
    order
ON
    customer.id = order.customer_id AND order.product_id = 12345;


который возвращает около 200 тыс записей, что много для фронтэнда. Хочу добавить дальнеюшую обработку через пагинацию в sql

SELECT
    customer.id AS customer_id,
    customer.name,
    order.id AS order_id,
    order.product_id
FROM
    customer
LEFT JOIN
    order
ON
    customer.id = order.customer_id AND order.product_id = 12345
LIMIT 10000 OFFSET m;


Таким образом m будет постепенно меняться от 0 до 190000, а пользователи будут постепенно перемещаться по базе кнопками страниц 1, 2 ... 200 на фронте.

1) Является ли это нормальной практикой?
2) Все запросы будут содержать неповторяющиеся rows? Или нет гарантии, что они не будут в случайном порядке?
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Хотите сделать пагинацию правильно - не используйте offset, а передавайте сведения сортировки последнего показанного поста.
https://use-the-index-luke.com/sql/partial-results...
https://use-the-index-luke.com/no-offset

Наверняка видели, когда переходите на следующую страницу (например, лента постов отсортированная по времени публикации), вы вдруг видите те же самые записи что только что видели - просто потому что пока вы читали предыдущую страницу кто-то опубликовал новые посты и offset вас честно сдвинул.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Да какой пользователь 10000 тыщ записей способен прочитать??
Сделай поисковые атрибуты по Name там... еще где то.
И показывай первые 100 штук.
Ответ написан
NikFaraday
@NikFaraday
Student full-stack Developer
Как я делал на бекенде: передаётся номер страницы n. Так же у меня уже есть константа на количество записей на странице (допустим 10). Далее я делаю выборку от n * 10 элемента до (n + 1) * 10
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы