Как работает разбиение на страницы и как это помогает сократить время отклика при работе с миллионами записей? - PullRequest
0 голосов
/ 27 января 2019

Я работаю над торговым приложением, которое развернуто в Weblogic и имеет ограничение, заключающееся в том, что любой запрос, который обрабатывается более одной минуты, автоматически уничтожается.Ограничение установлено на уровне ядра и не зависит от приложения, и мы не можем его изменить.

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

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

Я провел много поисков до публикации этого запроса о том, как работает нумерация страниц и как это помогает сократить время ответа, но не получил конкретного ответа.Так было бы здорово, если бы кто-нибудь мог помочь мне объяснить это.Заранее спасибо !!!

1 Ответ

0 голосов
/ 28 января 2019

Первый предложенный мною подход заключался в использовании нумерации страниц вместо запросов ко всем записям одновременно.Мне сказали, что это не поможет, так как на стороне базы данных он будет каким-либо образом извлекать все записи одновременно

Это верно, если вы используете предложение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...