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

数据库小白咨询一个 MySQL 数据表的设计问题

  •  
  •   wangzi1993 · 1 天前 · 1584 次点击

    每天约 80W 数据增量的订单表,在 MySQL 数据库中怎么设计存储,才能方便查询使用近两个月的数据。 按天分区 or 按月分区?

    18 条回复    2025-04-03 10:58:28 +08:00
    meshell
        1
    meshell  
       1 天前
    我怎么想得是按用户分表呀,统计的事情交给统计服务去做。
    la2la
        2
    la2la  
       1 天前
    每天 80w 每个月合计 2400w, 按月分表或者双月分表都可以。
    如果需要复杂逻辑分析的话,接个 cdc 同步数据到 doris 这些 olap 数据库中
    jigujigushanshan
        3
    jigujigushanshan  
       1 天前
    按两个月分
    LiaoMatt
        4
    LiaoMatt  
       1 天前
    @jigujigushanshan 近两个月是动态的, 按两个月分肯定不行, 如果只能用 MySQL 还是单独按月分, 不过最好引入其他类型的 DB, 不然很多场景容易遇到瓶颈
    lepig
        5
    lepig  
       1 天前
    大家按月分表一般如何操作,请教一下?

    是直接停机,还是写脚本自动执行
    prodcd
        6
    prodcd  
       1 天前
    分库、分表、分区,最后才是分区,可以先按用户 id 取模分库、分表。
    pxllong
        7
    pxllong  
       1 天前
    换个数据库 支持 shading 的 例如 mongodb 、tidb 、阿里云的 porladb
    弄个支持分表分表的中间件 kingshard 、mycat
    wangzi1993
        8
    wangzi1993  
    OP
       1 天前
    @prodcd 为啥是按照用户分表啊,1L 也这么说,我这个是订单表,你们说的用户是数据库的用户吗?比如我们这 80W 的增量数据其实就只有 36 个城市,基本上是每个城市的用户用他们自己的数据,只有我们中台会用到全量数据,这种场景是不是按照城市分区好一点呢?
    worldgg
        9
    worldgg  
       1 天前
    @wangzi1993 #8 好奇,如果我换了城市,是不是会看不到历史单据
    guofushan2903
        10
    guofushan2903  
       1 天前
    用 shardingjdbc ,不要用 mysql 原生的分区表,可以按月分片
    peteretep
        11
    peteretep  
       1 天前
    经典方案:google 关键字 “mysql 分库分表面试题”
    新潮方案:tidb
    layxy
        12
    layxy  
       1 天前   ❤️ 1
    @lepig 定时任务提前创建表,比如定时任务每年年中创建明年的 12 个月的分表
    qiuhang
        13
    qiuhang  
       1 天前
    最朴实无华的是分表,每 2 个月分一个表,每张表 5000 万左右,做好索引的话问题不大。
    Plating
        14
    Plating  
       1 天前
    关键是选择好分片的片键字段,需要贴近业务。Java 建议选择 shardingjdbc
    tanoak
        15
    tanoak  
       1 天前
    提供一个我们的思路,基于 id hash 分区,统计走 binlog 同步数据到 es 或者是大数据那套 hive
    prodcd
        16
    prodcd  
       20 小时 0 分钟前
    @wangzi1993 因为大多查询是从用户角度去查的,这样分区可以让查询只打开一个分区文件。你说的按城市分区,城市也是用户的一个属性,也是将用户的订单分散到不同库、表、区。但不同城市的订单量可能差距很大,铁岭和上海肯定订单量不同。一般使用 user.id 取模,或者 username 哈希,这样不同库、表、区的订单量会比较平均。
    如果你还要兼顾按时间统计订单信息,那么可以考虑先按月份分区,然后再使用 user.id 进行子分区。
    mikawang
        17
    mikawang  
       6 小时 47 分钟前
    如果用 pg 的话,可以试试 timescaledb ,分区、压缩等等等自动帮你做了
    hugqq
        18
    hugqq  
       5 小时 1 分钟前
    首先这日增 80w 的数据量 mysql 的支持就不友好,硬要用 mysql 做分区,直接用月做分区不就得了,分区的操作是不推荐的还不如分表。其实最好就是氪金上数仓解君愁。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5287 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 07:59 · PVG 15:59 · LAX 00:59 · JFK 03:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.