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

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

  •  
  •   wangzi1993 · 25 天前 · 2088 次点击

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

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

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