thomaswang
V2EX  ›  问与答

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

  •  
  •   thomaswang · Feb 16, 2018 · 6181 views
    This topic created in 3027 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

    PS:估计 ES 在这个场景下,哪怕单节点,性能也不会差(前提是关闭 ranking )
    lance6716276
        24
    lance6716276  
       Feb 16, 2018 via Android
    一年前 tidb 的学长给过我们一个某软件的 alpha 版,已经记不清了,做复杂运算测试的时候千万行还是秒级,估计现在 tidb 也可以了吧
    kltt22
        25
    kltt22  
       Feb 16, 2018 via Android
    @wqzjk393 你忘了建索引吧,千万数据跑起来还是挺流畅的。
    feverzsj
        26
    feverzsj  
       Feb 16, 2018
    @alcarl tag 系统设计可以参考 danbooru 这些图站的
    nandaye
        27
    nandaye  
       Feb 16, 2018 via Android
    @alcarl 传统数据库比你想的可能还是强不少的,where 条件多个没问题的,电影标签的分类没多少可分的
    cnbattle
        28
    cnbattle  
       Feb 16, 2018 via Android
    @thomaswang 一般这个得具体自身实际业务场景设计,不管数据库还是代码都得量身设计,V 友们要么根据你举得例子的理解说说,要么就是一个同通用的想法,别想着有怎样一个完整通用的方法,还是得根据具体自身实际业务场景来
    ebony0319
        29
    ebony0319  
       Feb 16, 2018 via Android
    @terranboy 我相信不是所有的电影都有便签的。
    wellsc
        30
    wellsc  
       Feb 17, 2018 via iPhone
    @bzzhou 编程珠玑第一章。。
    Daming
        31
    Daming  
       Feb 17, 2018
    做好分区+索引
    ycz0926
        32
    ycz0926  
       Feb 17, 2018
    @thomaswang 倒让我想起了一次面试,面我的人问的也是一个类似的问题,我回答说,分库、分表、缓存、再不然上集群……
    可最后,他说我得考虑业务方面
    这种问题,似乎不如问算法、cs 领域的理论来的贴切,这种问题不管你怎么答,都是每个准的,这个收敛的结果,只把握在问你的人手里
    ycz0926
        33
    ycz0926  
       Feb 17, 2018
    还有一个就是,看面的岗位吧,你说要是一个 php 的 dev,问这种问题,是去做 TL、做架构么?还是让我兼职 DBA 呢 。。。😅
    cjyang1128
        34
    cjyang1128  
       Feb 17, 2018
    列一下方案:
    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 吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   960 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 5414617a · 67ms · UTC 20:42 · PVG 04:42 · LAX 13:42 · JFK 16:42
    ♥ Do have faith in what you're doing.