千万级数据的表应该怎么设计分表规则? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justlikemaki
V2EX    数据库

千万级数据的表应该怎么设计分表规则?

  •  1
     
  •   justlikemaki 2015-05-26 14:48:12 +08:00 2211 次点击
    这是一个创建于 3801 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在和同事一起创业,是移动互联网的项目。现在还是设计初期,考虑到后期可能的用户增长,如果用户数达到了千万级,对一张表进行查询肯定会慢,但是要分表可能会有其它问题。我考虑的分表,如果是按月份分,后期的数据一个月内可能就会达到千万级,那这样分就没什么意义了。如果是先创建好所有的分表,按照平均的规则写入到个表中,查询的时候就不知道怎么查了。特地来这里问问各位,遇到这种问题应该怎么解决呢?

    39 条回复    2015-05-29 14:17:23 +08:00
    willvvvv
        1
    willvvvv  
       2015-05-26 14:58:51 +08:00
    具体的业务场景描述一下
    moro
        2
    moro  
       2015-05-26 15:01:09 +08:00
    有个标准,就是可以很容易做到水平扩展。
    Septembers
        3
    Septembers  
       2015-05-26 15:04:58 +08:00
    数据规模不是问题 表结构设计合理性 才是大问题
    数据规模上来啦无非就是 分库 分表 主写从读 集群化
    wy315700
        4
    wy315700  
       2015-05-26 15:06:10 +08:00   2
    先上线吧 我觉得你们想多了,
    justlikemaki
        5
    justlikemaki  
    OP
       2015-05-26 15:06:22 +08:00
    @willvvvv 主要是对用户的查询这方面,考虑到后期用户量大,一个登录可能就会很慢,连表的查询也会慢,所以寻求分表的规则或者是标准。
    Septembers
        6
    Septembers  
       2015-05-26 15:06:39 +08:00
    数据库选型也很重要 我PgSQL单表几十亿都不是问题
    wshcdr
        7
    wshcdr  
       2015-05-26 15:08:13 +08:00
    @wy315700 说得对
    justlikemaki
        8
    justlikemaki  
    OP
       2015-05-26 15:08:59 +08:00
    @Septembers 就是说可以先用一张表,数据上来了再分开?我现在的主要问题就不知道到底该怎么分表啊。。。
    justlikemaki
        9
    justlikemaki  
    OP
       2015-05-26 15:09:43 +08:00
    @Septembers 我也是打算用pgsql的。
    wy315700
        10
    wy315700  
       2015-05-26 15:10:12 +08:00   1
    @justlikemaki
    首先mysql,INNODB的话配上大内存,TB级别的数据是没有问题的。

    然后到了那个数据量,你们自然会有办法解决这个问题了。
    ifconfig
        11
    ifconfig  
       2015-05-26 15:10:59 +08:00   1
    mysql5.1之后有分区技术,业务都写好了再拆表岂不是要重构代码,而且楼上说的数据库选型也很重要 PgSQL单表几十亿都不是问题
    Septembers
        12
    Septembers  
       2015-05-26 15:13:35 +08:00   1
    如果用户真发展到那个规模了 你也不缺钱请DBA
    JoeShu
        13
    JoeShu  
       2015-05-26 15:33:22 +08:00
    想太多,过度优化是万恶,技术是可以迭代的,等用户达到那个量级再优化。
    huijiewei
        14
    huijiewei  
       2015-05-26 15:45:05 +08:00
    噗。还没开始你就想着千万级的优化? 想太多了啊
    em70
        15
    em70  
       2015-05-26 15:49:02 +08:00   1
    大多数失败的项目,都是败在只有100人的考虑1亿用户的事情,互联网项目需要小步快跑
    vinceguo
        16
    vinceguo  
       2015-05-26 16:00:25 +08:00
    数据量这么大为什么还要用mysql?
    直接上hadoop, hive, hbase, spark, 随便玩.
    gamexg
        17
    gamexg  
       2015-05-26 16:06:06 +08:00
    搭车问一个问题,类似与监控宝ping日志怎么保存比较好?
    直接存数据库是不是太坑了?

    1000站点 * (24*60)/5 = 288000。
    一天288000条日志,1个月8640000条。

    直接存文本文件?查询比较麻烦些...
    huobazi
        18
    huobazi  
       2015-05-26 16:08:34 +08:00
    等你一个月千万级时你的钱肯定够买 100 个 DBA 帮你搞定这事情了
    publicID001
        19
    publicID001  
       2015-05-26 16:10:17 +08:00   1
    @gamexg 不坑
    mhycy
        20
    mhycy  
       2015-05-26 16:11:36 +08:00   1
    @gamexg
    有样东西叫NoSQL...
    这是一个极其符合NoSQL环境的需求...
    试试mongodb如何?
    h2ero
        21
    h2ero  
       2015-05-26 16:15:27 +08:00
    过早优化不太好。
    immjun
        22
    immjun  
       2015-05-26 16:19:02 +08:00
    @mhycy 试试 PostgreSQL 如何 ?
    lyragosa
        23
    lyragosa  
       2015-05-26 16:50:51 +08:00
    过度优化是万恶!
    wdongxv
        24
    wdongxv  
       2015-05-26 16:54:16 +08:00
    现在2千多万,还没分表,啥时候撑不住再分
    zhicheng
        25
    zhicheng  
       2015-05-26 16:58:22 +08:00 via Android
    才千万。。。你们也太小瞧数据库了。
    xiaoyuvps
        26
    xiaoyuvps  
       2015-05-26 16:59:33 +08:00
    到500W再研究不好么?
    a398058068
        27
    a398058068  
       2015-05-26 17:15:51 +08:00   1
    这个不着急。 主从复制 , 分库分表。 这些后面弄都可以。 特别是用户表这种一般都有自增长主键 要做分库分表很简单 再加个主从 主写从读 千万不是事
    E2gCaBAT5I87sw1M
        28
    E2gCaBAT5I87sw1M  
       2015-05-26 17:34:52 +08:00
    选 PostgreSQL,另外:先上线吧 我觉得你们想多了。
    server
        29
    server  
       2015-05-26 17:36:38 +08:00
    不要过早优化
    yanze013
        30
    yanze0613  
       2015-05-26 17:42:42 +08:00
    等你们如果用户数达到了千万级,之前,雇个专业的架构师和DBA吧
    wadezhao
        31
    wadezhao  
       2015-05-26 17:50:13 +08:00   1
    楼主等你有了一千万用户,我确信解决方案自己biu的就蹦出来了,不是开玩笑…………
    MarsWang
        32
    MarsWang  
       2015-05-26 20:28:41 +08:00 via iPhone
    千万级单表没啥问题,量上来在说吧
    wmttom
        33
    wmttom  
       2015-05-26 20:32:00 +08:00   1
    @gamexg
    现在在用 InfluxDB 放 API 的请求统计 event,感觉还不错,用的是 StatsD+InfluxDB+Grafana,自己订制的 gunicorn 自动收集每个 API 的请求统计数据。
    frankzeng
        34
    frankzeng  
       2015-05-26 20:32:57 +08:00   1
    @gamexg 一个月一个分区呗,超过一定时间导出来,压缩成文件,或是直接干掉。
    tangooricha
        35
    tangooricha  
       2015-05-26 22:38:19 +08:00
    @justlikemaki 在我们这,这个级别已经进hadoop集群了。
    billwang
        36
    billwang  
       2015-05-27 08:18:37 +08:00 via Android
    先把现在做好吧,这是真心话
    gamexg
        37
    gamexg  
       2015-05-27 16:20:13 +08:00
    @publicID001 感觉数量多了会挂掉...
    @mhycy 印象中mongodb很耗内存,做设备日志记录的时候测试一下。
    @wmttom 看着正合适,用的时候细看下...
    @frankzeng 经典的解决方案。
    rrrrutdk
        38
    rrrrutdk  
       2015-05-29 14:16:10 +08:00
    我就是这样过度优化结果什么也没做出来。

    看你的业务规则吧,比如用户登录时需要选定城市或部分等,如果没有的话,按一定的前缀分表:

    例如:

    如果你的网站支持手机登录,即手机号与用户编号绑定的话,使用号段分表,158, 153, 189等等,查询数据库前自己先判断号段再选择表名;

    如果你的网站使用登录名,可以以字母表分表,a-z0-9等等,同样在查询前先判断登录名第一位。当然,要是觉得两位也能接受也行,即aa, ab, ac, .....分表;

    如果同时支持手机号与登录名,先手机号再登录名按上述处理。
    rrrrutdk
        39
    rrrrutdk  
       2015-05-29 14:17:23 +08:00
    靠,我又没仔细看就在这里BB。钻地中……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3344 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 10:46 PVG 18:46 LAX 03:46 JFK 06:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86