V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
v21an
V2EX  ›  Go 编程语言

关于一个优化问题

  •  
  •   v21an · 2023-08-19 11:09:29 +08:00 · 979 次点击
    这是一个创建于 453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有一张交易表 100w 数据 和用户提成表( 100w+数据),和用户表( 3 千条数据), 目前需求是每个用户生成当月报表 csv , 交易表和分润表已经按月分表。

    我的处理逻辑就是 ,查询出 3k 条用户,然后循环进行查询交易表和提成表数据生成 csv 上传 oss 然后保存数据到一张新的报表记录表中,

    这样就有个问题 ,io 太大了。 循环 3k 条用户数据 每查询一个用户都要 查询交易表和用户提成表, 有没有什么优化思路。除了 mysql 数据库索引之外

    4 条回复    2023-08-23 00:10:17 +08:00
    vcbal
        1
    vcbal  
       2023-08-19 12:27:21 +08:00
    换个思路,比如把这些需要联表 分组查询的 直接以一条记录的形式存在一个新的报表表中,这样子是不是会好点儿?
    lindt99cocoa
        2
    lindt99cocoa  
       2023-08-19 14:18:22 +08:00
    物化视图
    yinmin
        3
    yinmin  
       2023-08-19 16:50:35 +08:00
    可以 1 次 select 直接出来结果的。指条明路,你自己研究一下:JSON_ARRAYAGG(JSON_OBJECT(...))
    zdking08135
        4
    zdking08135  
       2023-08-23 00:10:17 +08:00
    加几个限定:
    1. 生成报表只需要离线。
    2. 用户表基本固定 3k+,交易和提成按月分表,每个月的数据量 100w+

    在这基础上,我的建议是:
    找一个单独的机器,这个机器提供 4G 左右的内存,
    写一个 python 脚本,用 select * from xxx limit a, b 的方式,将用户表和交易表全部 load 到内存。
    然后手动实现 join 和统计之类的工作,之后写结果到 csv 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2502 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:10 · PVG 00:10 · LAX 08:10 · JFK 11:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.