Выбор ответа Senior Spring Data JPA обновлено

Медленная глубокая страница

Вопрос

Страница 50 000 списка заказов (PageRequest.of(50000, 20)) отвечает несколько секунд. Почему и что сделать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: OFFSET читает и отбрасывает миллион строк; нужна keyset-пагинация. Для OFFSET 1000000 LIMIT 20 база всё равно проходит первый миллион строк.

Варианты ответа

  1. OFFSET читает и отбрасывает миллион строк; нужна keyset-пагинацияправильный ответ
  2. Spring Data кеширует предыдущие страницы и переполняет память
  3. Не хватает индекса на колонке OFFSET, его надо создать
  4. Нужно увеличить размер страницы до 1000, чтобы страниц стало меньше

Разбор

Для OFFSET 1000000 LIMIT 20 база всё равно проходит первый миллион строк. Keyset-пагинация передаёт последнее значение ключа сортировки и читает сразу с нужного места по индексу. В Spring Data 3.1+ это ScrollPosition.keyset() и Window<T>. Кеширования страниц нет, а индекса «на OFFSET» не бывает. Больший размер страницы проблему не решает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.