报表需求背景
报表是一个很常见的需求,在项目中后期往往会需要加多种维度的一些统计信息,今天就来谈谈上线近10个月后的一次报表优化优化之路(从一天报表跑需要五分钟,优化至秒级)
需求:对代理商进行日统计
统计数据:门店数量、设备总数、当日订单数/金额/退款/收益、门店七日新增数、30日0订单门店数量
前置约束:未明确标明指定主库操作 以及 事务,则默认代表走 从库 以及 默认事务
先来看看这一版的流程:
// 以下所有查询/统计 均为从MySQL中获取
按天 开始 循环(任务调度时可指定日期补偿重跑,防止后续定时任务中断,默认跑昨日数据)
1. 获取所有代理商(大几千个)
代理商列表 循环开始
2. 门店统计
2.1 获取代理名下所有门店列表
2.2 查询代理近三十天内有订单的门店ID,对比门店列表 得到:30日0订单门店数量
2.3 获取代理名下七日新增门店
3. 设备总数统计
4. 订单统计
4.1 统计代理昨日订单数/订单金额/退款(订单/收益 均是千万级表)
4.2 统计代理昨日收益
代理商列表 循环结束
5. 新开事务 且 指定主库
5.1 清理对应日期的统计数据
5.2 对统计数据进行分批提交(mybatis拼接SQL,千条为一个批次,防止后续当日统计数据过多,导致SQL长度超限)
5.3 事务提