由A表和B表构成一个视图,他们直接用a表的主键关联,视图的目的是获取A表的全部内容以及统计B表的完成数和未完成数
A表
sqlCREATE TABLE `ATable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
-- 其他属性.....
)
B表
sqlCREATE 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',
-- 其他属性.....
)
视图
sqlcreate 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
javaPage<ATableV> page = new Page<>(req.getPage(), req.getRows());
page.setSearchCount(false);
引入ATable的接口类
javaint total = iATableService.count(wrapper);
resultPage.setTotal(total);
注意的地方就是视图的wrapper和表的wrapper筛选条件要保持一直,避免出现数量对不上的情况
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!