首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

求助大表优化方案

  •  
  •   alamaya · 2018-08-07 15:56:54 +08:00 · 1720 次点击
    这是一个创建于 487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一张用户标签表,一个用户一个标签一条数据,现在这张表超过 2 亿了,需要做分库分表,怎么分,既能满足用用户查询标签,也能用标签查询用户,以及数据结构、整体架构上能否优化,求助各位大佬。

    17 回复  |  直到 2018-08-09 08:02:58 +08:00
        1
    nine99   2018-08-07 16:10:28 +08:00
    搞两份,一份按用户分,一份按标签分。或者看下你业务按哪个查比较多,就怎么分
        2
    alamaya   2018-08-07 16:22:11 +08:00
    @nine99 主要是存在一个数据量不均衡的问题,有的标签用户很多,有的标签又没啥用户,所以还是只能按用户分,随着数据量的增长,可能还是会存在单表过大的问题。
    按用户分的话,分表的张数如何考虑,而且也确实有通过标签查用户的需求,虽然场景不多,这个查询怎么做好。
    或者说有没有比现有一个用户一个标签一条数据这样的数据存储方式更优化的数据结构?
        3
    owenliang   2018-08-07 16:26:28 +08:00
    按用户分 mysql。

    然后数据打到 ES/Mongo 中做旁路。
        4
    alamaya   2018-08-07 16:30:23 +08:00
    @owenliang 能详细说一下吗,还有就是性能上 ES/mongo 能否满足?因为涉及这张表的接口访问量都非常大
        5
    owenliang   2018-08-07 16:52:03 +08:00 via Android
    @alamaya 性能问题优先 redis 缓存热点,其次考虑 mysql 分表内走索引或者 mongodb 走索引,es 不适合那么高性能。
        6
    unforgiven   2018-08-07 17:03:13 +08:00
    mysql 吗?表分区做了吗
        7
    alamaya   2018-08-07 17:25:24 +08:00
    @owenliang 那针对少量的通过标签查用户的场景,怎么处理好?
        8
    owenliang   2018-08-07 19:17:54 +08:00 via Android
    @alamaya 不是 mongo 旁路了吗,是个分布式存储
        9
    abcbuzhiming   2018-08-07 23:40:13 +08:00
    @unforgiven 尽量不要做表分区,mysql 的表分区一直不太稳定,业界反应 bug 挺多的
        10
    jmone   2018-08-08 03:15:10 +08:00
    @nine99 的路子是最直接有效的,定好再次分表的规则,能够做到一直水平分下去,再做上 redis 主动缓存,2 亿数据可以快到不可想象
    @owenliang mongo 的性能就是 shit,过千万记录之后,加索引都救不了
        11
    sunsh2017   2018-08-08 09:02:13 +08:00 via Android
    全部改用 redis, 结束。
        12
    ebingtel   2018-08-08 09:29:03 +08:00
    @sunsh2017 按照 lz 的叙述,感觉数据量会一直增长,成本会不会太高啊?
        13
    ghos   2018-08-08 09:57:39 +08:00
    有没有什么没那么复杂的方案哦
        14
    zhengxiaowai   2018-08-08 10:35:58 +08:00
    你先搜索一下,这个问题在 V 站讨论不下十几次了
        15
    fireapp   2018-08-08 11:03:54 +08:00 via iPhone
    hbase 有点大炮打蚊子:数据存两套
    一套 userId + tag 当 rowkey,专门给用户查询 tag 用
    一套 tag + userId 当 rowkey, 给 tag 查用户用
    数据就是增长到 200 亿都是亚秒级查询
        16
    bapijun   2018-08-08 11:44:56 +08:00
    高性能 mysql 上面有一整章说这件事情怎么办,你可以看看,我记得知乎以前也有说过,主要是垂直拆分和水平拆分两种
        17
    sunsh2017   2018-08-09 08:02:58 +08:00 via Android
    @ebingtel 不高 用 redis 是最好的方案 用 set 即可 用户数不过百万 标签也不过百万 其实很省的 嫌费内存 你用 ssdb 好了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2035 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    ♥ Do have faith in what you're doing.