查看原文
其他

使用 PageHelper 插件分页查询很慢?一招帮你搞定!

终码一生 2023-07-06
点击“终码一生”,关注,置顶公众号
每日技术干货,第一时间送达!

耗时8个月联合打造 《 2023年Java高薪课程 》,更新了 102G 视频累计更新时长 500+ 个小时,需要的小伙伴可以了解下,一次购买,持续更新,无需2次付费。


1

描述


在项目中使用Mybatis分页插件分页查询十分缓慢,但是在数据库中执行速度却很快?

该数据库的表共有10000条数据,分页查询时,在数据库中是很快,但是在使用Mybatis分页插件的时候居然8s多!

2

原因


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

例如:

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

sql打印:

SELECT count(0)
 FROM (SELECT V.*,B.TypeName AS TravelTypeName
 FROM (SELECT A.PKID, A.ApplyOrderNo FROM t1 AS A
 LEFT JOIN t2 AS P
 ON P.ApplyOrderNo = A.ApplyOrderNo
 LEFT JOIN t3 AS T
 ON A.UserCode = T.UserCode ) AS V
 LEFT JOIN t4 AS B
 ON V.TravelCode = B.TypeCode AND V.UserCode = B.UserCode AND B.Isdel = 0)
SELECT V.*,B.TypeName AS TravelTypeName
 FROM (SELECT A.PKID, A.ApplyOrderNo FROM t1 AS A
 LEFT JOIN t2 AS P
 ON P.ApplyOrderNo = A.ApplyOrderNo
 LEFT JOIN t3 AS T
 ON A.UserCode = T.UserCode ) AS V
 LEFT JOIN t4 AS B
 ON V.TravelCode = B.TypeCode AND V.UserCode = B.UserCode AND B.Isdel = 0


3

优化方案


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


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

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

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

Long getOrderInfo_COUNT();

然后在去xml中写具体sql:

<select id="getOrderInfo" resultType="Long" useCache="false">
 SELECT V.*,B.TypeName AS TravelTypeName
  FROM (SELECT A.PKID, A.ApplyOrderNo FROM t1 AS A
  LEFT JOIN t2 AS P
  ON P.ApplyOrderNo = A.ApplyOrderNo
  LEFT JOIN t3 AS T
  ON A.UserCode = T.UserCode ) AS V
  LEFT JOIN t4 AS B
  ON V.TravelCode = B.TypeCode AND V.UserCode = B.UserCode AND   B.Isdel = 0
</select>
<select id="getOrderInfo_COUNT" resultType="Long" useCache="false">
 SELECT
 COUNT(1)
 FROM t1
</select>

注:getDeviceOrderInfo_COUNT()方法里面的sql自定义完成,尽量减少不必要的表关联,提高查询速率。
 

3

总结

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

4

解决办法
 
覆盖原Count的sql,根据官方文档自定义。注意返回值类型(Long)与方法名(原名_COUNT)

来源:huaweicloud.csdn.net/633562aad3efff3090b54fc4.htm

END

 

【福利】2023 高薪课程,全面来袭(视频+笔记+源码)


【福利】2023 高薪课程,全面来袭(视频+笔记+源码)


PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。



往期推荐



ChatGPT!王炸级更新!!!

代码改成多线程,竟有9大问题

3个技术男搞恋爱版 ChatGPT,估值70亿...

别再分库分表了,试试TiDB!

马斯克开源 Twitter 算法!推荐机制正式公开,GitHub Star 数已破万

Mybatis-Plus 开发提速器:mybatis-plus-generator-ui

DragonflyDB 1.0 正式 GA,性能是 Redis 的 25 倍,吊打 Redis!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存