由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 许可协议。转载请注明出处!