Spring Data带order by查询时Slice是否比Page性能更优
结论
即使查询包含order by子句,org.springframework.data.domain.Slice的性能优势仍然存在,你给出的两个示例中,使用Page的版本执行速度确实慢于Slice版本。
核心原因分析
Page返回值的底层固定会触发两次查询:- 第一次是全量匹配结果的
count(*)统计查询,用于计算总页数、总条目数,Spring Data生成count语句时会自动去掉order by子句,这一步是Slice完全没有的额外开销 - 第二次才是带
limit、offset和order by的实际数据查询
- 第一次是全量匹配结果的
Slice返回值只会触发一次查询:
为了判断是否存在下一页,只会将查询的limit设置为请求页大小+1,比如你示例中请求页大小为3,实际会查询4条数据,只要返回结果超过3条就标记存在下一页,全程不需要统计全量数据总数。
对应示例的SQL执行差异
第一个使用Page的示例实际执行的SQL
-- 额外的count查询,Slice版本不会执行 select count(*) from employee; -- 实际数据查询 select * from employee order by name limit 3 offset 0;
第二个使用Slice的示例实际执行的SQL
-- 仅执行一次查询,多查1条判断是否有下一页 select * from employee order by name limit 4 offset 0;
补充说明
如果表数据量极小,count(*)的开销可以忽略不计,两者的性能差异可能感知不到,但本质上Page还是多了一次查询请求的开销,性能劣势始终存在。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

