求教个 Mysql 数据库分库分表的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Laysan
V2EX    数据库

求教个 Mysql 数据库分库分表的问题

  •  
  •   Laysan 2023-08-22 14:28:06 +08:00 2947 次点击
    这是一个创建于 783 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个表 biz_order 是单表的,目前已经 600W+数据,每日还在 30w 增长量

    考虑把 biz_order 表分库分表,分成 10 库 100 表,根据 order_id hash 计算分表位

    现在的问题是创建好表了,旧数据如何快速迁移到新的分表里面

    用存储过程能快速迁移么?还是要写代码慢慢查询再插入?

    26 条回复    2023-08-23 19:13:34 +08:00
    plutome
        1
    plutome  
       2023-08-22 14:32:16 +08:00   1
    600W 而已。insert into select xxxxx 也花不了多久。
    qizheng22
        2
    qizheng22  
       2023-08-22 14:33:30 +08:00
    shardingjdbc 分库分表,不是有个 sharding-ui 和 sharding-proxy 。
    shardingproxy 相当一个中单件,用 mysql 客户端连接,再导入。
    仅用 order_id 的 hash 分表,以后表不够,再扩展就麻烦了
    dusu
        3
    dusu  
       2023-08-22 14:43:31 +08:00 via iPhone   1
    按 1kw 分一次表 上线后等 id 满了切就行
    不用考虑这次迁移 一个表不差几百 w
    与其考虑迁移 不如多考虑分表后的数据聚合问题吧
    yungeo
        4
    yungeo  
       2023-08-22 14:47:41 +08:00
    不考虑使用 datax 吗?
    declandragon
        5
    declandragon  
       2023-08-22 15:07:43 +08:00
    写个小脚本,多线程分段处理数据很快的,我也是 3 楼的想法,聚合怎么办
    T0m008
        6
    T0m008  
       2023-08-22 15:10:20 +08:00
    订单表难道不是把旧日期的分出去吗,过时的订单能有多少流量?
    wqhui
        7
    wqhui  
       2023-08-22 15:16:51 +08:00
    不理解怎么会想要分 100 个表存储,有没想过如果查询条件里面没有带上分表键需要所有表扫一次,应该是把冷数据归档掉,分表只存热数据。除非规定每个查询一定要带分表键,或者把这些数据同步到别的组件比如 es 上
    Granado
        8
    Granado  
       2023-08-22 15:25:55 +08:00
    说下我的想法吧:
    如果是有明显时间冷热的数据,建议的做法是定期归档然后,删除历史数据,查历史数据的时候就查归档。当然这么做也需要有一定的基建后比较轻松。

    如果采用分表,以后非分表维度的查询(例如你文中提到的 order_id 分表,查询的时候需要查用户的订单,查询维度是 user_id )就会比较麻烦,要构建单独的查询索引(例如前面提到的 user_id ---> order_ids 的映射),这时候又会有额外的维护(索引维护,数据一致性问题,延迟问题)。

    这时候我建议还是直接上 tidb 这种天然支持分表的,维护成本低很多,相对来说迁移也比较好迁移,前期数据量低可以停机迁移,数据量大先双写单读,再单写单读就好。
    me1onsoda
        9
    me1onsoda  
       2023-08-22 15:46:04 +08:00
    2023 年还有人分库分表吗?这方案还是建立在以前 hhd 低速存储的前提下,以后 ssd 都比 hhd 便宜,速度再提升,要进历史的垃圾桶吧?
    james2013
        10
    james2013  
       2023-08-22 15:50:47 +08:00
    我觉得分库没有必要,直接在 1 个库里分 100 张表,使用和维护比较方便
    存放分表数据采用代码提供的唯一的 id,然后使用代码分批插入,比如每次 3000 条
    kanepan19
        11
    kanepan19  
       2023-08-22 15:55:13 +08:00
    那个是怎么说来着, 分表分库是解决插入问题的。
    kanepan19
        12
    kanepan19  
       2023-08-22 15:56:55 +08:00
    接上面,分表分库是解决 插入性能不足问题的。
    查询性能不行,加读库 或 olap
    lsk569937453
        13
    lsk569937453  
       2023-08-22 15:58:54 +08:00
    自己写程序迁移,有唯一 id 的好迁移。
    dw2693734d
        14
    dw2693734d  
       2023-08-22 16:31:28 +08:00
    @me1onsoda 2023 年了,还有人不知道 shard 是很多公司(包括谷歌, 微软)在数据库管理中常用的技术吗?通过将数据分割成较小的部分,可以提高数据库的性能和可扩展性。
    dw2693734d
        15
    dw2693734d  
       2023-08-22 16:33:07 +08:00
    说到分库分表 shard ,就不得不提一下 postgres 了,使用 citus 插件,一键分表,自动计算 hash

    me1onsoda
        16
    me1onsoda  
       2023-08-22 16:59:48 +08:00
    @dw2693734d 你别光说好处,代价呢?
    dw2693734d
        17
    dw2693734d  
       2023-08-22 17:09:18 +08:00
    @me1onsoda 用空间换时间,本来就是互联网公司常用的技术。缓存不也是一样的道理。
    dailiha01sy
        18
    dailiha01sy  
       2023-08-22 17:50:03 +08:00
    一年也才一个亿 分啥
    gam2046
        19
    gam2046  
       2023-08-22 18:36:38 +08:00
    @dw2693734d #14 大佬,现在我正好遇到一个问题,现在有一个 postgres 表,存在一个 timestamp 类型的字段,而这个字段又是索引字段,很多地方需要通过这个来作为查询条件。同时这个字段更新又非常频繁,导致索引也需要频繁更新,进而导致 IO 性能低下。

    针对这种场景,有什么优化建议嘛,目前索引类型是 btree
    poembre
        20
    poembre  
       2023-08-22 19:57:00 +08:00
    我有个单表表 目前 7 亿+ 数据量, 一周差不多 2-3KW 写入量。
    lovelylain
        21
    lovelylain  
       2023-08-22 20:29:52 +08:00 via Android
    按 uid hash 分库分表,将这个 hash 值塞到 order_id 里,这样既能通过 uid 从一个表找到用户的所有订单,又能通过 order_id 找到对应的表。至于已经存在的历史 order ,因为改 order_id 使其符合新规则可能有隐患,建议不迁移,这样一个用户最多查一次新表一次旧表就能找出所有订单,旧表没有新记录写入也不用担心性能下降,而且订单是有时效的,过段时间还能直接干掉旧表。
    dw2693734d
        22
    dw2693734d  
       2023-08-22 22:39:04 +08:00 via iPhone
    @gam2046 用 brin 索引试试呢
    phx13ye
        23
    phx13ye  
       2023-08-22 23:04:32 +08:00
    新数据双写,历史数据迁移或归档
    mmdsun
        24
    mmdsun  
       2023-08-22 23:50:23 +08:00
    没多少数据直接 sql 插入。还是需要不停机维护?

    分表分库注定要被淘汰,建议选择云数据库、分布式数据库。
    kanepan19
        25
    kanepan19  
       2023-08-23 14:07:44 +08:00
    @phx13ye
    不停机归档,有没有方案?
    phx13ye
        26
    phx13ye  
       2023-08-23 19:13:34 +08:00
    @kanepan19 没做过太高大上的,
    1select 源库数据,插入归档库,两边校验,delete 源数据库历史数据, 对源表做一下 alter table tb_123 engine=innodb ,释放空间

    最后两步可选
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     916 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:59 PVG 04:59 LAX 13:59 JFK 16:59
    Do have faith in what you're doing.
    ubao 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