Первый предложенный мною подход заключался в использовании нумерации страниц вместо запросов ко всем записям одновременно.Мне сказали, что это не поможет, так как на стороне базы данных он будет каким-либо образом извлекать все записи одновременно
Это верно, если вы используете предложение LIMIT и OFFSET в своем запросе на пагинацию,В этом случае база данных загружает сопоставленные записи (с предложением WHERE) с диска, а затем применяет предложения OFFSET и LIMIT.Поскольку базы данных используют B-дерево для индексации, он не знает, чтобы перейти к записи OFFSET напрямую, не загружая сопоставленные записи в память.
Чтобы загрузить только записи о размере страницы, вам нужно использовать key based pagination
.В этом подходе мы избегаем предложения OFFSET, вместо этого мы используем key
of record и предложение LIMIT.
Пример пагинации на основе ключей:
Допустим, вы хотитечтобы разбить пользователей на страницы
Запрос на первые 10 записей:
select * from user where userid > 0 order by userid asc limit 10
Допустим, последний идентификатор пользователя в приведенном выше запросе - 10.
Запрос на следующие 10 записей:
select * from user where userid > 10 order by userid asc limit 10