为什么分页查询比 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:

  1. Using Slice as return typeSlice 没有公开查找元素总数的方法,但是它允许您了解下一个切片是否可用。我们通过读取比请求多一个元素并将其(不)存在作为下一个切片可用性的指示器来避免此处的计数查询。
  2. Using List as return type — 这将简单地将分页参数应用于查询和 return window 选择的元素。但是,它不会让您了解后续数据是否可用。