【问题记录】【Mybatis-Plus】报表查询慢之自定义分页查询中的统计个数

发布时间 2023-04-13 08:07:43作者: 酷酷-

1  问题原因

生产环境系统的券表、会员信息表本身比较大,然后查询券的时候会关联会员表进行查询,本身select 并不慢大概2-3秒,但是页面查询就是慢是分页的,猜测可能就是分页查询的时候统计个数的时候慢,试着数据库执行了一下,还真是,count就要快达到一分钟了,慢的原因找到了,就是要优化这个分页统计个数的问题了。

2  解决思路

问题原因定位到了,那么解决思路呢?

(1)首先要看一下Mybatis-Plus支持用户自定义分页查询的个数统计么,这个是支持的

(2)支持的情况下,我们就要解决统计个数慢的SQL ,它为什么慢,怎么才能不慢

(3)SQL慢解决后,更改我们的代码,改为我们的自定义统计个数的完事

那我们就先来解决下统计的慢SQL的问题,首先慢不慢除了我们自身的一些优化经验外,我们都要会看执行计划,看是哪里导致的慢,比如我们的统计数量的SQL的执行计划如下:

当我们去掉两处join的话,速度明显不慢了

我这里统计数量可以不带这两个join所以我去掉就可以了,当然如果你们的join去不掉的话,你们可能就要考虑join进表来是要辅助查询还是要做条件筛选,可能就需要冗余字段进来或者通过代码里查询去组装你的数据了哈。

那统计数量的SQL改好了,就基本差不多了,将SQL写进我们的Mapper中,其次要关闭Mybatis-Plus的自动统计数量的,这个简单,一句话搞定。

page.setSearchCount(false);

然后再把我们自定义的引进来:

page.setTotal(paymentCardMapper.totalPaymentTicket(wrapper));

完事了。

3  小结

总结下来,自定义分页统计个数的我们大致需要两步:1、关闭分页的查询 2、设置我们的自定义查询

Page<Map> page = new Query<Map>(params).getPage();
// 1、关闭Mybatis-Plus的统计查询
page.setSearchCount(false);
// 2、设置我们自己写的统计数量的查询
page.setTotal(paymentCardMapper.totalPaymentTicket(wrapper));

希望对大家有用哈,有理解不对的地方欢迎指正哈。