PageHelper分页查询优化

描述:
在项目中使用Mybatis分页插件分页查询十分缓慢,但是在数据库中执行速度却很快?
该数据库的表共有10000条数据,分页查询时,在数据库中是很快,但是在使用Mybatis分页插件的时候居然8s多!

原因:
PageHelper在做分页查询的时候,select count(0) 会先把原来的查询语句全部重新查询一遍(未做数量限制),然后再执行select count(0)操作,相当于查询两遍,导致查询速度慢。

例如:

1
select count(*) from ("原来的查询sql,相当于多查了一遍") user

优化方案:
在原来的查询方法后面,加上”_COUNT”,重写总数量查询方法,优化sql,覆盖默认的数量查询方法。

例如原来的mapper接口里面的查询方法:

1
Page<Map<String, Object>> getOrderInfo(Map<String, Integer> map);

现在重写一个方法,getOrderInfo后面加“_COUNT”:返回类型必须为Long

1
2
3
4
5
6
7
8
<select id="getOrderInfo" resultType="Long" useCache="false">
...
</select>
<select id="getOrderInfo_COUNT" resultType="Long" useCache="false">
SELECT
COUNT(1)
FROM t1
</select>

总结:
分页插件中的计算Count的sql语句,会将需要分页的所有数据查出来然后生成一个临时表,再去计算Count。如果数据量比较大,生产临时表就多查询了一次表,会导致最后Count计算会十分慢,从而影响分页的结果。

文章作者: GeYu
文章链接: https://nuistgy.github.io/2023/03/29/PageHelper分页查询优化/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yu's Blog