V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
petelin
V2EX  ›  问与答

十亿 mysql 数据优化,主键能否用 uid+雪花算法 id

  •  
  •   petelin · 2023-02-13 22:01:43 +08:00 · 1453 次点击
    这是一个创建于 646 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景是这样的,有一个 1T 的数据库,里面有 10 亿条数据, 表结构如下

    uid status pay_method refund_status create_time amount device_id xxx

    业务上对这个库每天会插入几百完数据,qps 高峰在几百,有一些稍微复杂的查询(主要是会查用户全部的数据),索引不能覆盖全,需要回表的时候,IO 会被打的很高。

    select sum(amount) from xx where user_id = xx ,status =xx ,pay_method =xx

    (比如这个 sql ,查到 5000 行有效数据的话,需要回表因为数据太过分散,需要去 5000 个 page 上查数据,IO 就会很差,这里 buffer pool 完全存不下 1T 的数据,讨论这种冷用户的查询)

    我想的一个解决办法是,把 User_id + 雪花算法 id 当作主键,这样用户的数据都在一起,回表就不需要查 5000 个 page ,顺序 io 小几百就 ok 了。

    但是 mysql 主键一般是用自增的当作索引,避免空洞和页分裂,业务场景插入 qps 不高,这种方案是更合适的吗 ?

    第 1 条附言  ·  2023-02-14 22:44:19 +08:00
    这已经是拆完表之后的条件了,实际数据比这大的多,场景写少读少,就是用户多,用户订单数据不均衡,有需要实时算一些用户的数据,,,
    8 条回复    2023-02-14 22:43:07 +08:00
    Azzsanjin
        1
    Azzsanjin  
       2023-02-13 22:09:54 +08:00
    只插入不更新?要不试试时许数据库
    arloor
        2
    arloor  
       2023-02-13 23:45:19 +08:00 via Android
    clickhouse
    LeeReamond
        3
    LeeReamond  
       2023-02-13 23:53:59 +08:00
    直觉感觉不合适,一般认为 uuid 在 orcale 上是很合适的主键,mysql 则优化很少。不过你们 mysql 能顶到 10 亿数据也挺厉害的。。。
    lingly02
        4
    lingly02  
       2023-02-14 00:46:03 +08:00
    不能做分区表吗
    litguy
        5
    litguy  
       2023-02-14 08:18:55 +08:00
    @lingly02 他这个不是分库分表的问题,一个用户的所有信息查询,其实 MySQL 不如列式数据库,过去在项目中,也有 10 亿记录查询,匹配某几个关键字的所有记录 fetch 需求,那时候用 Cassandra ,跑得还不错,注意主键设计就好,因为涉及到 data sharding
    superares
        6
    superares  
       2023-02-14 08:39:01 +08:00 via iPhone
    按照 uid 拆表呢?每一万用户一个表
    imokkkk
        7
    imokkkk  
       2023-02-14 09:01:19 +08:00
    MySQL MRR 貌似是解决这种问题的?
    petelin
        8
    petelin  
    OP
       2023-02-14 22:43:07 +08:00
    @litguy 我再看看 Cassandra ,其实 aws 的 dynamodb 比较合适,可以把 uid 当作分片键,create time 当作主键。uid 数据都在一起可以快速 scan ,也可以加二级索引,而且二级索引还支持带一些额外字段(但不作为索引字段)
    你这里说的主键难道就是我想的那样,user_id}_{create_time_random_id} ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:54 · PVG 21:54 · LAX 05:54 · JFK 08:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.