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

数据规模在 10 亿条,表如何设计,什么合适的方案

  •  
  •   thomaswang · 2018-02-16 20:29:07 +08:00 · 5691 次点击
    这是一个创建于 2505 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如: 电影资源有 10 亿级别,电影标签有 1000 个( eg:武侠,言情,剧情,悬疑, 90 年代...), 每个电影有不确定个标签

    用户检索的时候,可能会点选不确定个标签,这样的场景在实际生产中如何处理

    34 条回复    2018-02-17 17:14:00 +08:00
    murmur
        1
    murmur  
       2018-02-16 20:35:28 +08:00
    有十亿部电影那么多么
    Event
        2
    Event  
       2018-02-16 20:36:11 +08:00
    @murmur 比如...
    murmur
        3
    murmur  
       2018-02-16 20:36:41 +08:00
    @Event 没有比如 当需求太离谱的时候先反省需求
    有的时候从业务上可以把需求优化上去
    l30n
        4
    l30n  
       2018-02-16 20:43:34 +08:00 via Android
    有类似如何进行取样,模糊处理后在小规模数据上进行操作的论文。
    gouchaoer
        5
    gouchaoer  
       2018-02-16 20:46:21 +08:00 via Android
    电影本身真有 10 亿可以分表,后期流量太大上 tidb,检索上 es 吧,用数据库不现实。。。因为一个标签对应很多电影,你肯定要按照某一规则排序
    thomaswang
        6
    thomaswang  
    OP
       2018-02-16 20:46:29 +08:00
    @murmur 你这么较真,那我把电影改成文章吧
    murmur
        7
    murmur  
       2018-02-16 20:49:39 +08:00   ❤️ 2
    @thomaswang 不 这种大数据肯定要具体分析的
    比如你没提到的:
    1、精确度如何,可以漏数据么
    2、并发,不谈并发谈大数据都是耍流氓
    3、数据更新速度如何,要求某些数据实时刷新么
    4、每条数据的数据量如何

    就你那个电影的例子,热 tag 缓存 新 tag 人工审核(放你大天朝带审核才是合理业务设计) 再加上电影爱好者的维护 tag 能命中老高的缓存了
    wqzjk393
        8
    wqzjk393  
       2018-02-16 20:52:25 +08:00 via iPhone
    加大服务器集群配置…我千万级别的数据,查询时候只要带个 where 就要几分钟了,加一点运算就要几个小时了。觉得表再怎么设计,对付大数据量都是没啥用
    thomaswang
        9
    thomaswang  
    OP
       2018-02-16 20:59:45 +08:00
    各位老铁,我想表达的是,数据量大一点的,不定个标签搜索,表怎么设计,外加什么软件(es)来提高搜索速度, 这是多年以前的一个面试题目,当时面的是 web 开发,那家公司给了 15k,没有去,我不知道这个题目好一点的答案
    guoer
        10
    guoer  
       2018-02-16 21:02:17 +08:00
    10 亿也不多呀。es 多个节点即可。说到底还是得看具体需求。
    murmur
        11
    murmur  
       2018-02-16 21:04:17 +08:00   ❤️ 1
    @thomaswang 这还真不好回答
    刚才我去时光网看了一下
    时光网 2017 年电影的主键才到 2x xxxx 导演多一点 到 100 多 w 了 虽然不知道是不是乱编或者漏了多少数据
    但是用电影做例子显然还不够大数据的考点
    所以才要求你具体的场景
    另外很聪明的时光网貌似没自定义 tag 音乐的量大一点但是网易云也没 tag 所以似乎大家都很聪明的回避了这个问题
    nandaye
        12
    nandaye  
       2018-02-16 21:13:44 +08:00 via Android   ❤️ 2
    以 oracle 为例,先对标签分类放不同列很有必要,大多数数据库做模糊搜索效率都比较差,比如年代 tag1,类型 tag2,国家 tag3 等等,然后 tag 加位图索引,必选的 tag 可以直接 partition 分区,问题不大应该。我 3 亿多数据加唯一索引查询零点几秒出结果
    ebony0319
        13
    ebony0319  
       2018-02-16 21:21:48 +08:00 via Android
    电影信息主表,便签主表,另外一个表记录便签与电影信息的关系。分表加索引,查询肯定是分页的。一页二十条应该也很快的。
    terranboy
        14
    terranboy  
       2018-02-16 21:27:13 +08:00 via Android
    @ebony0319 另一个表存关系 那这个表得多大
    sagaxu
        15
    sagaxu  
       2018-02-16 21:30:20 +08:00
    @thomaswang 才 15K ?这个问题解决好了,至少值 50K 以上。
    izhangzhihao
        16
    izhangzhihao  
       2018-02-16 21:40:55 +08:00 via Android
    图数据库
    3a3Mp112
        17
    3a3Mp112  
       2018-02-16 21:44:51 +08:00
    其实这不是单纯的表设计问题了, 是大数据的问题。
    doubleflower
        18
    doubleflower  
       2018-02-16 21:56:31 +08:00 via Android
    @wqzjk393 你没做索引而已
    feverzsj
        19
    feverzsj  
       2018-02-16 21:59:43 +08:00
    10 亿单表还是能处理的,用 clustered index,或者升级下硬件吧
    alcarl
        20
    alcarl  
       2018-02-16 22:17:18 +08:00 via Android
    应该需要 elastic 了,传统 sql 数据库玩不转
    alcarl
        21
    alcarl  
       2018-02-16 22:18:49 +08:00 via Android
    @nandaye 同时查数个标签就慢了,况且这种需求标签应该也是会增加的
    alcarl
        22
    alcarl  
       2018-02-16 22:19:42 +08:00 via Android
    @feverzsj 单表 10 亿是可以,但这个表还有一千列。。。。。
    bzzhou
        23
    bzzhou  
       2018-02-16 22:21:45 +08:00   ❤️ 1
    如果仅仅是满足各种标签的组合的检索,而不考虑 ranking 的情况
    那么直接利用 bitmap 倒排拉链即可

    10 亿电影,每个电影从 0 自增分配 id ;然后每个标签,用一个包含 10 亿个 bit 的 bitmap 来表示是否包含某部电影。

    每个标签的存储开支:1,000,000,000bit,大概 120M 的存储空间
    那么 1000 个标签,理论上需要 120G 的存储空间

    至于检索的性能,如果数据可以全部落入到内存中,那么几个标签的过滤,基本都是 10ms 级别

    如果要落入磁盘,那么多准备几块 SSD 也可以

    PS:估计 ES 在这个场景下,哪怕单节点,性能也不会差(前提是关闭 ranking )
    lance6716276
        24
    lance6716276  
       2018-02-16 22:31:35 +08:00 via Android
    一年前 tidb 的学长给过我们一个某软件的 alpha 版,已经记不清了,做复杂运算测试的时候千万行还是秒级,估计现在 tidb 也可以了吧
    kltt22
        25
    kltt22  
       2018-02-16 22:48:39 +08:00 via Android
    @wqzjk393 你忘了建索引吧,千万数据跑起来还是挺流畅的。
    feverzsj
        26
    feverzsj  
       2018-02-16 22:48:55 +08:00
    @alcarl tag 系统设计可以参考 danbooru 这些图站的
    nandaye
        27
    nandaye  
       2018-02-16 22:49:34 +08:00 via Android
    @alcarl 传统数据库比你想的可能还是强不少的,where 条件多个没问题的,电影标签的分类没多少可分的
    cnbattle
        28
    cnbattle  
       2018-02-16 22:52:56 +08:00 via Android
    @thomaswang 一般这个得具体自身实际业务场景设计,不管数据库还是代码都得量身设计,V 友们要么根据你举得例子的理解说说,要么就是一个同通用的想法,别想着有怎样一个完整通用的方法,还是得根据具体自身实际业务场景来
    ebony0319
        29
    ebony0319  
       2018-02-16 23:31:34 +08:00 via Android
    @terranboy 我相信不是所有的电影都有便签的。
    wellsc
        30
    wellsc  
       2018-02-17 02:25:41 +08:00 via iPhone
    @bzzhou 编程珠玑第一章。。
    Daming
        31
    Daming  
       2018-02-17 08:24:01 +08:00
    做好分区+索引
    ycz0926
        32
    ycz0926  
       2018-02-17 14:52:20 +08:00
    @thomaswang 倒让我想起了一次面试,面我的人问的也是一个类似的问题,我回答说,分库、分表、缓存、再不然上集群……
    可最后,他说我得考虑业务方面
    这种问题,似乎不如问算法、cs 领域的理论来的贴切,这种问题不管你怎么答,都是每个准的,这个收敛的结果,只把握在问你的人手里
    ycz0926
        33
    ycz0926  
       2018-02-17 14:53:53 +08:00
    还有一个就是,看面的岗位吧,你说要是一个 php 的 dev,问这种问题,是去做 TL、做架构么?还是让我兼职 DBA 呢 。。。😅
    cjyang1128
        34
    cjyang1128  
       2018-02-17 17:14:00 +08:00
    列一下方案:
    1、自己做分库分表
    2、分布式数据库:Tidb 或者阿里云的某些产品比如 DRDS 或者 Petadata ;或者也可以调研一下 Greenplum,分布式的 pgsql
    3、搜索引擎:Solr 或者 ES
    4、NoSQL 类型比如 HBase

    1、2 数据可以平滑迁移,但是 3、4 需要较多的重构。我感觉你这个场景 HBase 应该可以完美 hold。如果公司没有 HBase 运维经验的话,可以考虑采购 HBase 的云产品。

    另外比较好奇的是,如果你这个是按标签的搜索场景的话,你们目前通过一张 tag_id_to_movie_id 这张关系表来 select 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:32 · PVG 12:32 · LAX 20:32 · JFK 23:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.