目前项目有个需求是,优化项目想所有大于 3 秒的接口。
但是在我们的系统里面充斥着几十张各种维度的统计报表。有得需要连表查询六七八张表,有的方法快五千多行快六千行(屎山,暂时不考虑去优化代码了)。
目前想到了有几种方案:
1 、加缓存,每次查询都从缓存里面找,未命中才查库。但是这个问题就是,虽然返回数据不算很多,但是架不住条件多,每个组合起来,key 就多了,服务器内存也不能再加了,所以没有考虑。
2 、考虑使用中间表统一处理, 每个报表建立一张中间表,统一采用定时任务,调用接口,获取最小维度的数据,放入中间表中,前端调用接口时,直接获取中间表的数据然后使用条件过滤,这样再需要去计算以及统计了。但是这种有点复杂,因为领导系统设计成统一的,也就是前端调用同一个接口,后端判断需要获取的是哪个报表,然后根据策略去获取对应中间表的数据。
还有哪些方案可以处理。

报表 3s 就要优化了?那只能把报表结果放入大宽表了

这么卷吗,我们财务一个报表可能要十几秒才能查出来,一个表可能都要 3 秒了

做个任务中心,提交生成报表的请求,在任务队列中执行。生成完之后网页通知下载。

如果需要快速,那当我没说

你的报表实际上是对多个表数据的汇总和计算是吧。如果不是实时报表,可以离线计算。如果是实时报表,可以监听 MySQL 的 binlog ,实时建宽表。

erp 报表都是这样

  1. 表连接多, 什么部门员工,区域,产品,产品类型, 品牌, 单位,仓库,库位,合作伙伴等等, 搞得数据冗余没法做
  2. 查询条件多, 且不断的增加, 索引最后没法可加, 总不能都加上
  3. 查询结果要精确,你搞个全文检索是不行的, 用户不认可
  4. 查询条件多+粒度细, 导致 你想用缓存结果没法处理, 因为条件多变,缓存通常不匹配
  5. 报表必须得有小计和总计,导致查询最少要两次, 一次汇总一次明细

等等

通常优化了一次, 下次需求进去就直接打回原形

sap 就很取巧, 搞了个 HANA 内存数据库, 弄个几十上百 g 内存, 将关系数据库全部搬到内存中去搞

没我们报表牛
点两次查询,把 cpu 干到 80%。
一次接口要 1 分钟。

之前老板点着没反应,又点了十几下,然后服务器崩了。

数据定时聚合到另一张表里面。然后单表查询这张聚合表

1.按照报表优先级可以每天凌晨提前预热到缓存
2.预聚合做成大宽表

报表 3 秒....搞成异步的,接口时间就下来了。

那就是接口没有做幂等性或者,前端没有限制。我不过我记得 cpu 的使用率是争对单核来的吧

领导一句话的事情

我们现在大数据量的下载就是这样弄的

是的, 就是汇总什么的计算,实时性要求不是很高,领导难得看一次。但是看一次就说慢,要优化。。。

这样就比较重了, 还要引入中间件,而且也没有人会这玩意

目前来说, 是这样做的

目前来说,是这样做的,但是没有缓存的参与, 服务器内存已经是上限。

查询接口还做幂... 我们只有 cud 做。
前端倒是做了表格 loading,但是没禁用查询按钮。

用的 fpm,也在同事本地的 wsl2 测试过。
点了十几次查,把他电脑也干死机了,只能强制电源键重启。

现在的标准解不是 MQ + ES 么,还是我过时了

也对, 这是一个查询, 我们查询好像也只是加了 loading , 有时候加了 loading ,出异常了还没有在 finally 中释放。。。