表里存放的都是原始数据,那么根据不同参数的复杂的聚合统计数据的图表应该怎么做?

随便举个简单的例子:
有个订单表,表里有门店id,商品id,售价,订单生成时间
如果需要做一个图表的api,用于展示:

  • 所有门店,在指定时间范围内销售额/订单量的排名
  • 指定门店,在指定时间范围内,每日销售额的增长率
  • 所有门店,在指定时间范围内,日销售额达到阀值的天数

这三个需求也是随便想的,我知道用sql+编程语言服务端处理,都能做到,但是效率很低、对数据库压力很大,接口响应很慢,不是吗?
而且我举的例子算很简单了,就一张表里做文章。实际业务,表结构可能复杂得多,可能还有门店归属公司、销售人员、产品所属厂商等等,都有对应的统计需求

比如我们增加一个元素:店员表
然后一个新需求是——

  • 指定门店,在指定时间范围内,每天的人均销售额(用于考察用人成本)

补充说明:店员人数是会变化的,要求算人均销售额的时候,按店员的入职时间,以及离职时间,来计算目标那一天的店员数量。
你们说,这种需求,图表怎么搞?比如api一次性要返回一个月的数据(横坐标有30天)。
再假如,一个数据中心的页面上,有8个这么复杂的图表。光sql聚合分组查询,就要查多少秒?

请问这种需求该如何实现?

目前尝试了中间缓存表,就是把图表要展示的数据定义成表,按最小时间单位,使用计划任务,主动计算存表。然后图表的api中仅读取中间缓存表来得到数据,而不去访问原始数据。
但这样做,太死板了,很不灵活。需求一变动,就得改中间表,删老数据,重新生成老数据。
我想,这不是一个好主意。

所以,应该怎么办?


PS:这个问题的回答,请尽量不要限语言。

阅读 1.5k
1 个回答

1,为何不实用reids来缓存数据存储,没条件也可以把需要展示的缓存数据json化存数据库,可避免改表删数据的问题
2,如果是mysql的话,对相关的查询条件字段添加索引,避免全表扫描。接口返回的数据还可以压缩一下,可参考gzip或br

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题