曾经参与的统计拆库+查询分库回顾

1.党建拆库

这一篇说到指挥平台上基本都是统计,我们通过etl工具将数据统计到中间表,再归档到mongo中,因为业务很多,所以统计中间表也很多,并且指挥平台上查询统计数字可以切换年份,为此我们的归档数据也按年份划分

每天定时任务默认跑当前年份的

考虑到这个情况,我们后来把中间统计表按年份分库,etl生成的时候进入对应年库

分库逻辑大概是这样:

生成时指定年月

根据年月分库,表名格式如下

插入数据库(由我们架构同事实现)

2.说完了统计如何实现,再说说查看详情的问题,我们查看详情,如果是地市,有三级页面,分别是地市-地市下的县区市-县区市下的街道/乡镇,,最后是列表。

一开始我们各业务各做各的,后面也是发现,跟统计一样,一二级详情基本也差不多,于是我们设计了一二级通用查询

首先定义一个配置文件,定义各业务的统计信息

查询时查询这个通用配置文件,根据指定的表名、入参统一查询

如果组件id在通用配置中,就走通用的查询

如果组件id不在通用配置中,就走自定义查询逻辑,实现查询接口

CustomDetailStatisticsCenter集中了所有自定义查询的实现

 查询接口

 listData中最后通过union all的方式联合查询多张中间统计表获得数据。因为我们中间统计表结构基本一致,所以可以这样做。

 由于我们做了分库,所以查询时也要查询 对应 统计库,我们通过一个DB注解完成

设置mybatis拦截器

根据统一的表名前缀看是否需要分库

如果需要分库,调用下面的方法

 方法中找到表名"_年月"的后缀,去到对应按年划分的统计库。

示例:select * from schema.gen_tablename_2021_01,变成 select * from schema_2021.schema.gen_tablename_2021_01

要求:查询默认从不分库的库开始,就要保证不分库的库有访问分库的权限。

思考和讨论:

1.为什么统计要分库

正如上面所说,因为指挥平台上统计有很多,一个业务又有多种统计,一种统计又可能是不同的数字,需要多个中间统计表才能完成

所以一年的表就有几千的量 

 

这在数据库设计层面上来说不太好 ,一般一个库不要超过4096张表

如果不分库,2年的表就过万了,势必给查询造成影响,也不利于DBA的管理,采用分库虽然程序上要做特别处理,但保证了年表的准备入库,为良好的开发奠定了基础。所以遇到这种表很多而且跟年份挂钩的时候,可以考虑按年分库

2.什么情况可以用mybatis plus拦截器?

这个可以查询mybatis plus官方文档看如何使用,一般在自定义一些场景下可能需要使用,比如自定义分页,分库,拦截语句做处理之类的。

3.既有通用实现,又要保留自定义实现,为了统筹,在一个文件中要把两种配置全部拿到。

4.面向接口编程,如何获取所有的接口实现类,或者说为什么需要获取所有的接口实现类?

获取所有的接口实现类可以通过get bean的方式获取,前提是这些实现必须是bean

getBeansOfType是ListableBeanFactory的方法,ListableBeanFactory是BeanFactory的默认实现。

获取所有接口的实现在第3点中说到因为要统筹通用实现和自定义实现

希望在后面的工作中也保持思考,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值