首页 > 其他分享 >PageHelper自定义count

PageHelper自定义count

时间:2022-08-25 17:23:55浏览次数:54  
标签:count JOIN 自定义 PageHelper sql table id

一、概述

PageHelper:com.github.pagehelper.PageHelper

 

二、问题描述

有一个分页需求,总数据有11万多,响应时间为3秒,测试提出了bug,响应时间太长。

sql如下:

a表有11万多数据,其他表数据很少

SELECT 
  COUNT(0) 
FROM
  table_a a 
  LEFT JOIN table_b b 
    ON b.ref_a_id = a.id 
  LEFT JOIN table_c c 
    ON c.ref_a_id = a.id 
  LEFT JOIN table_d d 
    ON d.ref_a_id = a.id 
  LEFT JOIN table_e e 
    ON e.ref_a_id = a.id 
  LEFT JOIN table_f f 
    ON f.ref_a_id = a.id 
WHERE a.deleted = 0 
  AND a.enabled = 1... 
SELECT 
  *
FROM
  table_a a 
  LEFT JOIN table_b b 
    ON b.ref_a_id = a.id 
  LEFT JOIN table_c c 
    ON c.ref_a_id = a.id 
  LEFT JOIN table_d d 
    ON d.ref_a_id = a.id 
  LEFT JOIN table_e e 
    ON e.ref_a_id = a.id 
  LEFT JOIN table_f f 
    ON f.ref_a_id = a.id 
WHERE a.deleted = 0 
  AND a.enabled = 1... 

给on后面的条件加了索引之后,响应时间减少到1.5秒;

count耗时1.15秒,select * 耗时0.35秒,就奇了怪了,count为什么比select * 还耗时呢?

就研究count的sql,看explain执行计划,也都有索引的感觉;数据库方面比较薄弱,百度了很久,此刻也说不出个所以然;

但是,我每注释一个left join,耗时就会少个0.18秒左右:

1.126
0.935 少0.191
0.722 少0.213
0.545 少0.177
0.387 少0.158
0.217 少0.170

那么,如果count的sql少几个left join也是可以降低响应时间的,按道理在业务上left join都是1对1的,count的时候确实不需要。

 

三、解决

1,高版本PageHelper的处理方式

百度:PageHelper自定义count

版本要5.0.4;简单说,就是除了写分页查询的sql,再写一个count的sql(id等于查询的sql拼接_COUNT),这样框架查询总数的时候会使用你写的count的sql;

 

2,低版本PageHelper的处理方式

像我的版本是4.1.6,升级到5.0.4又会报很多错,即使不报错,也存在一定的风险;

可以这么做:

原先的代码:

        int pageNum = 1;
        int pageSize = 20;
        PageHelper.orderBy("a.create_time desc");
        PageHelper.startPage(pageNum, pageSize);
        List list = 分页查询的sql;

        PageInfo pageInfo = new PageInfo<>(list);

修改后的代码:

        int pageNum = 1;
        int pageSize = 20;
        PageHelper.orderBy("a.create_time desc");
        PageHelper.startPage(pageNum, pageSize, false);
        List list = 分页查询的sql;

        // 自定义统计数量
        long count = PageHelper.count(new ISelect() {
            @Override
            public void doSelect() {
                count的sql;
            }
        });
        if (list instanceof Page) {
            Page page = (Page) list;
            page.setTotal(count);
        }

        // 最终的分页对象,和原先不使用自定义count的sql的时候一样
        PageInfo pageInfo = new PageInfo<>(list);

 

四、总结

PageHelper.count(ISelect select)方法要放在最后面,防止影响框架执行分页查询的sql;

 

标签:count,JOIN,自定义,PageHelper,sql,table,id
From: https://www.cnblogs.com/seeall/p/16624951.html

相关文章

  • 自定义滚动条样式不生效:横轴设置 height,纵轴设置 width
    问题在修改滚动条样式时,两个类名,一个地方生效,另一个地方不生效。解决办法捣鼓很久才发现,原来横轴要设置height,纵轴要设置width。//滚动条的样式,高宽分别对应横竖......
  • net-snmp 自定义OID利用脚本获取值
    两种办法:1)pass方式/etc/snmp/snmpd.conf   写脚本   脚本需要注意:要连续输出三行:1、OID2、类型3、值如果不按照这个规定,直接输出值,将会报错。检......
  • CountDownLatch+ThreadPool 优化统计报表
    一、功能要求业务方要求每天发一个统计日报到用户邮箱、业务为统计每日的多项市场指标数据,因为数据表中数据量庞大,每项指标的SQL是单独的逻辑,所以要在一个接口内执行多个S......
  • 微信小程序---自定义组件和传参
    1.自定义组件1.在项目根目录中新建components文件夹2.在components文件夹下新建组件的文件夹,如zujian3.鼠标右键点击zujian文件夹,选择新建component,就会生成wxml,wxss,js......
  • counter
    counter[fromcontre'against']Someone'sorsomething'scounterpartisanotherpersonorthingthathasasimilarfunctionorpositioninadifferentplace.......
  • 学习:python 异常处理 else 和 finall 语句 自定义异常
       自定义一个异常 ......
  • Thread+isInterrupted+自定义(停止线程)
    1.interrupt终端线程publicstaticvoidmain(String[]args)throwsInterruptedException{//创建子线程Threadthread1=newThread(()->{......
  • Ribbon:自定义负载均衡算法
    在springcloud同级,与启动类所在包不同级创建myrule包,写MyWTYRule配置  SpringCloud还允许您通过使用@RibbonClient声明其他配置(位于RibbonClientConfiguration之上......
  • zabbix自定义监控项
    zabbix自定义监控项zabbix报错排查#1.检查端口[root@zabbix~]#telnet172.16.1.510050#2.服务端是否能获取到客户端的监控数据[root@zabbix~]#yuminstall-......
  • 累加器的高级使用--实现wordcount
    HighWordCountAccumulator.scalapackageaccumulatorimportorg.apache.spark.util.AccumulatorV2importscala.collection.mutable/*继承AccumulatorV2类,传递......