为什么分页查询比 Spring 数据的普通查询慢?
Why is a paginated query slower than a plain one with Spring Data?
假设我有一个简单的查询:
List<Customer> findByEntity(String entity);
此查询 returns 700 毫秒内有 7k 条记录。
Page<Customer> findByEntity(String entity, Pageable pageable);
此查询 returns 1080 毫秒内有 10 条记录。我知道分页的额外计数查询,但似乎仍然有些问题。我还注意到一件奇怪的事情是,如果我将页面大小从 10 增加到 1900,响应时间在 1080 毫秒左右完全相同。
有什么建议吗?
分页方法运行两个查询:
1) select count(e.id) from Entity e //to get number of total records
2) select e from Entity e limit 10 [offset 10] //'offset 10' is used for next pages
第一个查询在 7k 条记录上运行缓慢,恕我直言。
即将发布 Ingalis of Spring Data will use improved algorithm for paginated queries (more info).
Any suggestions?
我认为使用包含 7k 条记录的分页查询是没有用的。你应该限制它。
这里的开销可能确实是计数查询。如果您坚持要知道集合中匹配的元素总数,那么不幸的是没有办法绕过这个额外的查询。但是,如果您能够牺牲信息,则有两种可能性可以避免更多的开销 returned:
- Using
Slice
as return type — Slice
没有公开查找元素总数的方法,但是它允许您了解下一个切片是否可用。我们通过读取比请求多一个元素并将其(不)存在作为下一个切片可用性的指示器来避免此处的计数查询。
- Using
List
as return type — 这将简单地将分页参数应用于查询和 return window 选择的元素。但是,它不会让您了解后续数据是否可用。
假设我有一个简单的查询:
List<Customer> findByEntity(String entity);
此查询 returns 700 毫秒内有 7k 条记录。
Page<Customer> findByEntity(String entity, Pageable pageable);
此查询 returns 1080 毫秒内有 10 条记录。我知道分页的额外计数查询,但似乎仍然有些问题。我还注意到一件奇怪的事情是,如果我将页面大小从 10 增加到 1900,响应时间在 1080 毫秒左右完全相同。
有什么建议吗?
分页方法运行两个查询:
1) select count(e.id) from Entity e //to get number of total records
2) select e from Entity e limit 10 [offset 10] //'offset 10' is used for next pages
第一个查询在 7k 条记录上运行缓慢,恕我直言。
即将发布 Ingalis of Spring Data will use improved algorithm for paginated queries (more info).
Any suggestions?
我认为使用包含 7k 条记录的分页查询是没有用的。你应该限制它。
这里的开销可能确实是计数查询。如果您坚持要知道集合中匹配的元素总数,那么不幸的是没有办法绕过这个额外的查询。但是,如果您能够牺牲信息,则有两种可能性可以避免更多的开销 returned:
- Using
Slice
as return type —Slice
没有公开查找元素总数的方法,但是它允许您了解下一个切片是否可用。我们通过读取比请求多一个元素并将其(不)存在作为下一个切片可用性的指示器来避免此处的计数查询。 - Using
List
as return type — 这将简单地将分页参数应用于查询和 return window 选择的元素。但是,它不会让您了解后续数据是否可用。