假设我有一个简单的查询:
List<Customer> findByEntity(String entity);
此查询在 700 毫秒内返回 7k 条记录。
Page<Customer> findByEntity(String entity, Pageable pageable);
此查询在 1080 毫秒内返回 10 条记录。我知道分页的额外计数查询,但仍然有些问题。我还注意到一件奇怪的事情是,如果我将页面大小从 10 增加到 1900,响应时间完全相同,约为 1080 毫秒。
有什么建议吗?
最佳答案
这里确实可能是计数查询的成本较高。如果您坚持要了解集合中匹配的元素总数,则不幸的是没有办法绕过该附加查询。但是,如果您能够牺牲返回的信息,则有两种可能性可以避免更多开销:
- 使用
Slice
作为返回类型 -Slice
不会公开用于查找元素总数的方法,但它允许您找出下一个切片是否可用。我们通过读取比请求的元素多一个的元素并使用其(不)存在作为下一个切片可用性的指示器来避免此处的计数查询。 - 使用
List
作为返回类型 - 这将简单地将分页参数应用于查询并返回所选元素的窗口。但是,它不会让您了解后续数据是否可用。
关于spring - 为什么使用 Spring Data 进行分页查询比普通查询慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44021665/