编辑
2024-09-06
学习记录
00
请注意,本文编写于 208 天前,最后修改于 208 天前,其中某些信息可能已经过时。

目录

前提
解决方法
关闭page的总数属性
查ATable总数填入

前提

由A表和B表构成一个视图,他们直接用a表的主键关联,视图的目的是获取A表的全部内容以及统计B表的完成数和未完成数

A表

sql
CREATE TABLE `ATable` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', -- 其他属性..... )

B表

sql
CREATE TABLE `BTable` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `type` int(1) NOT NULL DEFAULT '0' COMMENT '', `fault_status` int(1) NOT NULL DEFAULT '0' COMMENT '', `atable_id` bigint(20) char(19) NOT NULL DEFAULT '' COMMENT 'A表id', -- 其他属性..... )

视图

sql
create or replace algorithm = UNDEFINED view ATable_V as select a.id, --其他值...., count((case when (b.type = 0) then 1 end)) as conf, count((case when ((b.fault_status in (0, 3)) and (b.type = 0)) then 1 end)) as unconf from ATable a left join BTable b on a.id=b.atable_id group by a.id;

发现只要a表数据量大了,ATable_V视图分页查询就会慢,视图相关需要的索引都加上了

解决方法

因为视图分页查询时,mybatisPlus默认会开启获取总数,sql如下

SELECT COUNT(*) FROM ATable_V

这样就会导致需要计算很多的conf、unconf值,导致接口比较慢

由于我这个视图是已A表的数据为基准,所以统计总数的时候我不必计算conf以及unconf

关闭page的总数属性

java
Page<ATableV> page = new Page<>(req.getPage(), req.getRows()); page.setSearchCount(false);

查ATable总数填入

引入ATable的接口类

java
int total = iATableService.count(wrapper); resultPage.setTotal(total);

注意的地方就是视图的wrapper和表的wrapper筛选条件要保持一直,避免出现数量对不上的情况

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!