文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PageHelper插件count效率优化

2023-09-03 16:08

关注

PageHelper是项目中常用的分页插件,它在完成分页的过程中会执行两条SQL:

  1. limit分页sql
  2. count查总数sql(在不关闭插件count的前提下)

对于百万级以上的数据表,只要添加好索引,limit语句的速度很快,但是count语句的速度可能会非常慢,导致出现慢sql。

下面结合项目中实际遇到的一次慢sql优化,对PageHelper插件的count效率优化做一个总结。

问题描述

项目中存在如下sql:

select count(0)from table1 as aleft join table2 as b on a.aid = b.aidleft join table 3 as c on a.aid = c.aid and a.vin = c.vinwhere 1 = 1-- ifxxx1不是nulland a.xxx1 = xxx1-- ifxxx2不是nulland b.xxx2 = xxx2-- ifxxx3不是nulland c.xxx3 = xxx3;

这个sql的特点是:

  1. 用来计算总数,是pagehelper插件自动执行的
  2. 使用了left join,即以左表的数据为主
  3. where条件涉及了abc三张表,where条件将影响count的结果

腾讯云监控到的慢sql是:

select count(0)from table1 as aleft join table2 as b on a.aid = b.aidleft join table 3 as c on a.aid = c.aid and a.vin = c.vinwhere 1 = 1

即xxx1,xxx2和xxx3的查询条件不传入时会产生慢sql,通过explain分析,该慢sql走了全表扫描,扫描数据120w+,耗时2.5s左右。

下面的问题就是如何对这条sql进行优化。

PageHelper的count优化方法

方法1:关闭自动count

PageHelper.startPage(start, limit, false);

优点是简单粗暴,直接消灭自动执行的count语句,缺点是返给前端的参数里就没有真实的total了,前端只能做个假分页。

方法2:使用自定义的count语句代替自动执行的

在mapper.xml的这条查询语句下面再写一个查询:

  select * from table1            aid = #{aid,jdbcType=VARCHAR}      

 此时去掉了两次left join,虽然还是会走全表扫描,但执行时间从2500ms降低到了80ms。

而当输入了xxx2或xxx3条件时,就不关闭pagehelper的自动count,但是此时因为输入了具体的过滤条件,整个扫描的行数减少了很多,也就不会出现执行时间过长的问题了。

 

 

来源地址:https://blog.csdn.net/weixin_45712835/article/details/128519708

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯