Выбор ответа Senior Spring Data JPA обновлено
Медленная глубокая страница
Вопрос
Страница 50 000 списка заказов (PageRequest.of(50000, 20)) отвечает несколько секунд. Почему и что сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: OFFSET читает и отбрасывает миллион строк; нужна keyset-пагинация. Для OFFSET 1000000 LIMIT 20 база всё равно проходит первый миллион строк.
Варианты ответа
- OFFSET читает и отбрасывает миллион строк; нужна keyset-пагинацияправильный ответ
- Spring Data кеширует предыдущие страницы и переполняет память
- Не хватает индекса на колонке OFFSET, его надо создать
- Нужно увеличить размер страницы до 1000, чтобы страниц стало меньше
Разбор
Для OFFSET 1000000 LIMIT 20 база всё равно проходит первый миллион строк. Keyset-пагинация передаёт последнее значение ключа сортировки и читает сразу с нужного места по индексу. В Spring Data 3.1+ это ScrollPosition.keyset() и Window<T>. Кеширования страниц нет, а индекса «на OFFSET» не бывает. Больший размер страницы проблему не решает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.