随便举个简单的例子:
有个订单表,表里有门店id,商品id,售价,订单生成时间
如果需要做一个图表的api,用于展示:
- 所有门店,在指定时间范围内销售额/订单量的排名
- 指定门店,在指定时间范围内,每日销售额的增长率
- 所有门店,在指定时间范围内,日销售额达到阀值的天数
这三个需求也是随便想的,我知道用sql+编程语言服务端处理,都能做到,但是效率很低、对数据库压力很大,接口响应很慢,不是吗?
而且我举的例子算很简单了,就一张表里做文章。实际业务,表结构可能复杂得多,可能还有门店归属公司、销售人员、产品所属厂商等等,都有对应的统计需求
比如我们增加一个元素:店员表
然后一个新需求是——
- 指定门店,在指定时间范围内,每天的人均销售额(用于考察用人成本)
补充说明:店员人数是会变化的,要求算人均销售额的时候,按店员的入职时间,以及离职时间,来计算目标那一天的店员数量。
你们说,这种需求,图表怎么搞?比如api一次性要返回一个月的数据(横坐标有30天)。
再假如,一个数据中心的页面上,有8个这么复杂的图表。光sql聚合分组查询,就要查多少秒?
请问这种需求该如何实现?
目前尝试了中间缓存表,就是把图表要展示的数据定义成表,按最小时间单位,使用计划任务,主动计算存表。然后图表的api中仅读取中间缓存表来得到数据,而不去访问原始数据。
但这样做,太死板了,很不灵活。需求一变动,就得改中间表,删老数据,重新生成老数据。
我想,这不是一个好主意。
所以,应该怎么办?
PS:这个问题的回答,请尽量不要限语言。
1,为何不实用reids来缓存数据存储,没条件也可以把需要展示的缓存数据json化存数据库,可避免改表删数据的问题
2,如果是mysql的话,对相关的查询条件字段添加索引,避免全表扫描。接口返回的数据还可以压缩一下,可参考gzip或br