JAVA_FILLTHEGAPS Telegram 577
Как быстро отдавать данные по частям

Пагинация с первого взгляда кажется простой задачей. На практике это та ещё кроличья нора🌚

В этом посте расскажу 2 подхода к пагинации со стороны SQL, их плюсы, минусы и основные кейсы. За кадром оставим нюансы спринга и хибернейта.

Итак, пагинация бывает двух видов: offset и keyset.

🌸 Offset - для получения части данных используется (сюрприз) оператор offset. Первую страницу получаем так:
SELECT * FROM t ORDER BY …
LIMIT 100

Для второй и последующих добавляем offset:
SELECT * FROM t ORDER BY …
LIMIT 100 OFFSET 100

Offset показывает, сколько строк пропустить.

В чем подвох: кажется, что при offset 100 постгрес сразу прыгнет на 101 строку, но это не так. Он честно пройдет 100 строк, и потом отдаст следующие 100.

В случае большого оффсета такая операция будет работать долго даже при наличии индекса
Просто реализовать. Минимум действий со стороны клиента и поддержка в фреймворках.

🌸 Keyset пагинация. Она же cursor, она же seek.

Здесь мы используем where в паре с индексом и сразу прыгаем на нужную позицию. Первую страницу получаем так:
SELECT * FROM t ORDER BY name
LIMIT 10

Если записи отсортированы по имени, запоминаем имя последнего элемента. Пусть это будет х. Чтобы получить вторую страницу, добавляем where:
SELECT * FROM t ORDER BY name
WHERE name > x
LIMIT 10

Работает быстрее, чем вариант с оффсетом. Чем больше оффсет, тем значительнее разница
Сложнее в реализации, надо запоминать поле в последней пачке
Нельзя перейти к произвольной странице, только последовательная выдача данных

Когда что использовать?

Во многих докладах/статьях часто встречается мысль, что оффсет это ужас, и надо всегда использовать кейсет. На практике все не так категорично:

▫️ Если на сайте infinite scrolling или пользователь вряд ли будет много смотреть, вполне ок использовать простую оффсет пагинацию.

▫️ Если данные выкачиваются большими пачками для обработки, аналитики, миграции и тд, берём keyset пагинацию.

▫️ Если надо выгрузить много данных и прыгать по ним туда-сюда или у вас другой сложный случай, придется экспериментировать с индексами и запросами. Этот доклад хорошо показывает, что пагинация - далеко не тривиальная задача.

А поставить огонек качественному контенту очень просто, поэтому это нужно обязательно сделать🔥



tgoop.com/java_fillthegaps/577
Create:
Last Update:

Как быстро отдавать данные по частям

Пагинация с первого взгляда кажется простой задачей. На практике это та ещё кроличья нора🌚

В этом посте расскажу 2 подхода к пагинации со стороны SQL, их плюсы, минусы и основные кейсы. За кадром оставим нюансы спринга и хибернейта.

Итак, пагинация бывает двух видов: offset и keyset.

🌸 Offset - для получения части данных используется (сюрприз) оператор offset. Первую страницу получаем так:

SELECT * FROM t ORDER BY …
LIMIT 100

Для второй и последующих добавляем offset:
SELECT * FROM t ORDER BY …
LIMIT 100 OFFSET 100

Offset показывает, сколько строк пропустить.

В чем подвох: кажется, что при offset 100 постгрес сразу прыгнет на 101 строку, но это не так. Он честно пройдет 100 строк, и потом отдаст следующие 100.

В случае большого оффсета такая операция будет работать долго даже при наличии индекса
Просто реализовать. Минимум действий со стороны клиента и поддержка в фреймворках.

🌸 Keyset пагинация. Она же cursor, она же seek.

Здесь мы используем where в паре с индексом и сразу прыгаем на нужную позицию. Первую страницу получаем так:
SELECT * FROM t ORDER BY name
LIMIT 10

Если записи отсортированы по имени, запоминаем имя последнего элемента. Пусть это будет х. Чтобы получить вторую страницу, добавляем where:
SELECT * FROM t ORDER BY name
WHERE name > x
LIMIT 10

Работает быстрее, чем вариант с оффсетом. Чем больше оффсет, тем значительнее разница
Сложнее в реализации, надо запоминать поле в последней пачке
Нельзя перейти к произвольной странице, только последовательная выдача данных

Когда что использовать?

Во многих докладах/статьях часто встречается мысль, что оффсет это ужас, и надо всегда использовать кейсет. На практике все не так категорично:

▫️ Если на сайте infinite scrolling или пользователь вряд ли будет много смотреть, вполне ок использовать простую оффсет пагинацию.

▫️ Если данные выкачиваются большими пачками для обработки, аналитики, миграции и тд, берём keyset пагинацию.

▫️ Если надо выгрузить много данных и прыгать по ним туда-сюда или у вас другой сложный случай, придется экспериментировать с индексами и запросами. Этот доклад хорошо показывает, что пагинация - далеко не тривиальная задача.

А поставить огонек качественному контенту очень просто, поэтому это нужно обязательно сделать🔥

BY Java: fill the gaps


Share with your friend now:
tgoop.com/java_fillthegaps/577

View MORE
Open in Telegram


Telegram News

Date: |

Co-founder of NFT renting protocol Rentable World emiliano.eth shared the group Tuesday morning on Twitter, calling out the "degenerate" community, or crypto obsessives that engage in high-risk trading. Write your hashtags in the language of your target audience. On Tuesday, some local media outlets included Sing Tao Daily cited sources as saying the Hong Kong government was considering restricting access to Telegram. Privacy Commissioner for Personal Data Ada Chung told to the Legislative Council on Monday that government officials, police and lawmakers remain the targets of “doxxing” despite a privacy law amendment last year that criminalised the malicious disclosure of personal information. During the meeting with TSE Minister Edson Fachin, Perekopsky also mentioned the TSE channel on the platform as one of the firm's key success stories. Launched as part of the company's commitments to tackle the spread of fake news in Brazil, the verified channel has attracted more than 184,000 members in less than a month. How to create a business channel on Telegram? (Tutorial)
from us


Telegram Java: fill the gaps
FROM American