统计慢的报表一般怎么处理。
目前项目有个需求是,优化项目想所有大于 3 秒的接口。
但是在我们的系统里面充斥着几十张各种维度的统计报表。有得需要连表查询六七八张表,有的方法快五千多行快六千行(屎山,暂时不考虑去优化代码了)。
目前想到了有几种方案:
1 、加缓存,每次查询都从缓存里面找,未命中才查库。但是这个问题就是,虽然返回数据不算很多,但是架不住条件多,每个组合起来,key 就多了,服务器内存也不能再加了,所以没有考虑。
2 、考虑使用中间表统一处理, 每个报表建立一张中间表,统一采用定时任务,调用接口,获取最小维度的数据,放入中间表中,前端调用接口时,直接获取中间表的数据然后使用条件过滤,这样再需要去计算以及统计了。但是这种有点复杂,因为领导系统设计成统一的,也就是前端调用同一个接口,后端判断需要获取的是哪个报表,然后根据策略去获取对应中间表的数据。
还有哪些方案可以处理。
报表 3s 就要优化了?那只能把报表结果放入大宽表了
这么卷吗,我们财务一个报表可能要十几秒才能查出来,一个表可能都要 3 秒了
做个任务中心,提交生成报表的请求,在任务队列中执行。生成完之后网页通知下载。
如果需要快速,那当我没说
你的报表实际上是对多个表数据的汇总和计算是吧。如果不是实时报表,可以离线计算。如果是实时报表,可以监听 MySQL 的 binlog ,实时建宽表。
erp 报表都是这样
- 表连接多, 什么部门员工,区域,产品,产品类型, 品牌, 单位,仓库,库位,合作伙伴等等, 搞得数据冗余没法做
- 查询条件多, 且不断的增加, 索引最后没法可加, 总不能都加上
- 查询结果要精确,你搞个全文检索是不行的, 用户不认可
- 查询条件多+粒度细, 导致 你想用缓存结果没法处理, 因为条件多变,缓存通常不匹配
- 报表必须得有小计和总计,导致查询最少要两次, 一次汇总一次明细
等等
通常优化了一次, 下次需求进去就直接打回原形
sap 就很取巧, 搞了个 HANA 内存数据库, 弄个几十上百 g 内存, 将关系数据库全部搬到内存中去搞
没我们报表牛
点两次查询,把 cpu 干到 80%。
一次接口要 1 分钟。
之前老板点着没反应,又点了十几下,然后服务器崩了。
数据定时聚合到另一张表里面。然后单表查询这张聚合表
1.按照报表优先级可以每天凌晨提前预热到缓存
2.预聚合做成大宽表
报表 3 秒....搞成异步的,接口时间就下来了。
那就是接口没有做幂等性或者,前端没有限制。我不过我记得 cpu 的使用率是争对单核来的吧
领导一句话的事情
我们现在大数据量的下载就是这样弄的
是的, 就是汇总什么的计算,实时性要求不是很高,领导难得看一次。但是看一次就说慢,要优化。。。
这样就比较重了, 还要引入中间件,而且也没有人会这玩意
目前来说, 是这样做的
目前来说,是这样做的,但是没有缓存的参与, 服务器内存已经是上限。
查询接口还做幂... 我们只有 cud 做。
前端倒是做了表格 loading,但是没禁用查询按钮。
用的 fpm,也在同事本地的 wsl2 测试过。
点了十几次查,把他电脑也干死机了,只能强制电源键重启。
现在的标准解不是 MQ + ES 么,还是我过时了
也对, 这是一个查询, 我们查询好像也只是加了 loading , 有时候加了 loading ,出异常了还没有在 finally 中释放。。。
最近在学习一些数据挖掘的算法,看到了这个算法,也许这个算法对你来说很简单,但对我来说,我是一个初学者,我在网上翻看了很多资料,发现中文社区没有把这个问题讲得很全面很清楚的文章,…
业务场景就是会写一些 http 接口,json 协议,会用 sqlite,websokcet 之类的 oatpp C++的话 Boost 算是一个比较完整的解决方案? …
更完之后我只看到通知栏多了个请勿打扰模式, 其他完全感觉不到更了什么, 我最感兴趣的资源管理器 tab 没有. mp.weixin.qq.com/s/YbbhPVOhNv0…