it_worker365

   ::  ::  ::  ::  :: 管理

最近做了一个概览页的功能,需求和前提如下:

数据已经做了分库分表,量大,B表为A表的下级数据

1. 需要统计按照不同维度A表内和B表内的数据总量

2. 需要分别统计A/B两个表在给出的某段日期区间内的总量和增量数据统计

需求看似十分简单,一开始完全无脑的实现

对于1,就是多线程分别统计然后合并加载到缓存

对于2,也是多线程分表统计然后加载到缓存,缓存为查询的开始结束日期

结果?慢的令人发指,应届生可能都做不了这么差

这里有什么问题?

1. 首先这里我忽略了两个表之间的关系,在第一个表中隐含了第二个表的统计数据,但是测试环境数据不准,导致我没用这个特性,后来经过咨询别人知道线上没有这个问题,可以直接用这个现有信息做统计  --- 及时沟通很重要

2. 数据是死的人是活的,当天之外的历史数据永远都不会变,为什么还要每次查? ---  通过一个任务触发历史数据加载到Mongo数据库,之后每天1点加载前一天的变化数据到Mongo,这样当天之外的数据完全不需要跟业务表打交道

3. 对于业务表查询的SQL语句,如果是包含>= and <=之类的,性能远低于=,切换思路后,所有的数据查询都变为了某一天的数据查询,本身的SQL性能也得到了提升

4. 对于包含当天的数据查询,考虑到数据库分库分表时已经是有序的,所以可以利用这个特性当天数据从最后一张开始查,这样顶多查两张表就没有数据了,减少了查询表的数量,提升了查询效率

5. 提升用户体验,利用后台定时任务每隔几分钟触发一个更新缓存的任务,这样,对于页面使用者体验就会更好,基本没有等待 

通过这个简单的任务过程,会发现自己在开发中还是缺少思考,技术永远是为业务服务

posted on 2018-11-20 15:41  it_worker365  阅读(574)  评论(0编辑  收藏  举报