V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heganghua
V2EX  ›  数据库

统计慢的报表一般怎么处理。

  •  
  •   heganghua · 14 天前 · 1506 次点击
    目前项目有个需求是,优化项目想所有大于 3 秒的接口。
    但是在我们的系统里面充斥着几十张各种维度的统计报表。有得需要连表查询六七八张表,有的方法快五千多行快六千行(屎山,暂时不考虑去优化代码了)。
    目前想到了有几种方案:
    1 、加缓存,每次查询都从缓存里面找,未命中才查库。但是这个问题就是,虽然返回数据不算很多,但是架不住条件多,每个组合起来,key 就多了,服务器内存也不能再加了,所以没有考虑。
    2 、考虑使用中间表统一处理, 每个报表建立一张中间表,统一采用定时任务,调用接口,获取最小维度的数据,放入中间表中,前端调用接口时,直接获取中间表的数据然后使用条件过滤,这样再需要去计算以及统计了。但是这种有点复杂,因为领导系统设计成统一的,也就是前端调用同一个接口,后端判断需要获取的是哪个报表,然后根据策略去获取对应中间表的数据。
    还有哪些方案可以处理。
    20 条回复    2025-04-10 16:14:50 +08:00
    xwayway
        1
    xwayway  
       14 天前
    报表 3s 就要优化了?那只能把报表结果放入大宽表了
    Mandyer
        2
    Mandyer  
       14 天前
    这么卷吗,我们财务一个报表可能要十几秒才能查出来,一个表可能都要 3 秒了
    cccn
        3
    cccn  
       14 天前
    做个任务中心,提交生成报表的请求,在任务队列中执行。生成完之后网页通知下载。
    cccn
        4
    cccn  
       14 天前
    @cccn 如果需要快速,那当我没说
    lifei6671
        5
    lifei6671  
       14 天前
    你的报表实际上是对多个表数据的汇总和计算是吧。如果不是实时报表,可以离线计算。如果是实时报表,可以监听 MySQL 的 binlog ,实时建宽表。
    jjx
        6
    jjx  
       14 天前   ❤️ 1
    erp 报表都是这样
    1. 表连接多, 什么部门员工,区域,产品,产品类型, 品牌, 单位,仓库,库位,合作伙伴等等, 搞得数据冗余没法做
    2. 查询条件多, 且不断的增加, 索引最后没法可加, 总不能都加上
    3. 查询结果要精确,你搞个全文检索是不行的, 用户不认可
    5. 查询条件多+粒度细, 导致 你想用缓存结果没法处理, 因为条件多变,缓存通常不匹配
    6. 报表必须得有小计和总计,导致查询最少要两次, 一次汇总一次明细

    等等

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


    sap 就很取巧, 搞了个 HANA 内存数据库, 弄个几十上百 g 内存, 将关系数据库全部搬到内存中去搞
    lyxxxh2
        7
    lyxxxh2  
       13 天前
    没我们报表牛
    点两次查询,把 cpu 干到 80%。
    一次接口要 1 分钟。

    之前老板点着没反应,又点了十几下,然后服务器崩了。
    Tinyang
        8
    Tinyang  
       13 天前
    数据定时聚合到另一张表里面。然后单表查询这张聚合表
    cosen
        9
    cosen  
       13 天前
    1.按照报表优先级可以每天凌晨提前预热到缓存
    2.预聚合做成大宽表
    cheng6563
        10
    cheng6563  
       13 天前
    报表 3 秒....搞成异步的,接口时间就下来了。
    heganghua
        11
    heganghua  
    OP
       13 天前
    @lyxxxh2 那就是接口没有做幂等性或者,前端没有限制。我不过我记得 cpu 的使用率是争对单核来的吧
    heganghua
        12
    heganghua  
    OP
       13 天前
    @Mandyer 领导一句话的事情
    heganghua
        13
    heganghua  
    OP
       13 天前
    @cccn 我们现在大数据量的下载就是这样弄的
    heganghua
        14
    heganghua  
    OP
       13 天前
    @lifei6671 是的, 就是汇总什么的计算,实时性要求不是很高,领导难得看一次。但是看一次就说慢,要优化。。。
    heganghua
        15
    heganghua  
    OP
       13 天前
    @jjx 这样就比较重了, 还要引入中间件,而且也没有人会这玩意
    heganghua
        16
    heganghua  
    OP
       13 天前
    @Tinyang 目前来说, 是这样做的
    heganghua
        17
    heganghua  
    OP
       13 天前
    @cosen 目前来说,是这样做的,但是没有缓存的参与, 服务器内存已经是上限。
    lyxxxh2
        18
    lyxxxh2  
       13 天前
    @heganghua
    查询接口还做幂... 我们只有 cud 做。
    前端倒是做了表格 loading,但是没禁用查询按钮。

    用的 fpm,也在同事本地的 wsl2 测试过。
    点了十几次查,把他电脑也干死机了,只能强制电源键重启。
    spritecn
        19
    spritecn  
       13 天前
    现在的标准解不是 MQ + ES 么,还是我过时了
    heganghua
        20
    heganghua  
    OP
       13 天前
    @lyxxxh2 也对, 这是一个查询, 我们查询好像也只是加了 loading , 有时候加了 loading ,出异常了还没有在 finally 中释放。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:45 · PVG 08:45 · LAX 17:45 · JFK 20:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.