V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
edis0n0
V2EX  ›  数据库

MySQL 单表上亿条数据有必要考虑分表吗?目前已经 8400 万条了,感觉查询耗时也没有明显提升,就是 CPU 不查询占用也在 20%以上,不知道在干什么。如果有必要的话求推荐下 EF Core 上安全、好用的分表方法。

  •  
  •   edis0n0 · Sep 25, 2022 · 7062 views
    This topic created in 1317 days ago, the information mentioned may be changed or developed.
    38 replies    2022-10-17 13:08:39 +08:00
    lyhiving
        1
    lyhiving  
       Sep 25, 2022
    主要看是什么数据,读写频率是怎么样的。如果没事就没必要动
    documentzhangx66
        2
    documentzhangx66  
       Sep 25, 2022
    请先思考一个问题,为什么要分表。
    wxf666
        3
    wxf666  
       Sep 25, 2022
    前排问一下,一直说的『单表超过 x 千万后,效率瞬间下降』,是因为 B+ 树层数变高(这个量级应该是 3 层变为 4 层吧),但缓存没变(比如,只缓存了前两层),导致看起来原本实际进行一次 IO ,现在需要两次,即多一倍耗时?

    如果是这样,那楼主看看现在是不是已经 4 层 B+ 树了,若是就不必要分表了?( 4 层可以容纳上百亿行了吧)
    ychost
        4
    ychost  
       Sep 25, 2022
    没必要,分表查询就很蛋疼了一般都需要分表键做路由,只要查询命中索引率高就没必要去折腾了
    thinkershare
        5
    thinkershare  
       Sep 25, 2022
    如果你觉得性能没问题, 就先不要管它, 等到性能出问题再去处理, 每多加一个中间层次, 都会引入很多其它的问题需要处理, 性能问题就是这样, 出了问题再去考虑优化。
    changdy
        6
    changdy  
       Sep 25, 2022
    过早的优化是万恶之源 ..

    简单场景还是别分表了 后期 维护麻烦
    Maxwe11
        7
    Maxwe11  
       Sep 25, 2022
    1 、现在跑的好好的服务,不要随便调整;
    2 、但是可以自己预先做模拟,先分析业务问题,再做潜在设计,然后在测试服务器上做模拟,以防万一某一天突然出问题,可以迅速找到解决方案,毕竟业务等不得;
    3 、分区分表建索引,搭缓存,各种技术方案还是由业务需求来的,如果对业务不熟悉,且对业务发展预期不清楚,确实可能会发生比如某种业务变动,导致这个提前的优化操作阻碍业务进行的情况发生,确保至少在未来新一年整体规划里,业务的变动都在考虑范围内,别到时候今天优化完了明天一调整还得回滚,好心办坏事儿还得背锅,别问我是怎么知道的。
    az467
        8
    az467  
       Sep 25, 2022
    网络八股文说单表上亿会有性能问题,所以才要分表。

    你这都没性能问题,瞎折腾好玩吗?
    agmtopy
        9
    agmtopy  
       Sep 25, 2022
    预估一下啥时候出问题?在你任职时间之外管它干嘛~
    zibber
        10
    zibber  
       Sep 25, 2022
    同步到 tidb
    victorc
        11
    victorc  
       Sep 25, 2022
    单表不能上亿那扯淡的,现在硬件很强劲,特别是用了 nvme 的 ssd ,比起 hd 来有几十倍的性能提升,我的业务 mysql 跑在虚拟机上,而且磁盘还是云盘! 单表上亿也能用

    分表是个大动作,要修改的地方非常多,你可以盘点一下表里面的数据,不需要得数据及时归档
    misaka19000
        12
    misaka19000  
       Sep 25, 2022
    没遇到瓶颈不需要折腾,有瓶颈了再去考虑
    ruiyinjinqu
        13
    ruiyinjinqu  
       Sep 25, 2022
    也看你写入删除的频率,分表分得不均匀也会造成问题,还有对于逻辑的优化
    LuckyLight
        14
    LuckyLight  
       Sep 26, 2022
    如果表的字段比较多或者一行数据占用的空间比较大,按照现在的数据量,还是要考虑分表的吧
    T0m008
        15
    T0m008  
       Sep 26, 2022
    不能光看数量,还要看数据结构,整个表占用空间,和未来的增长速度等等
    pavelpiero
        16
    pavelpiero  
       Sep 26, 2022
    看看硬盘的配置 ssd 的话 上亿也很就还好
    bthulu
        17
    bthulu  
       Sep 26, 2022
    别优化表了, 优化硬件最简单, SATA 机械换 NVME 的固态, 性能瞬间提升 100 倍. 你再想想你怎么优化单表能达到 100 倍以上的性能?
    zt5b79527
        18
    zt5b79527  
       Sep 26, 2022
    我们订单表里 1.3e 数据,跑的飞快,一点问题没有(国内某公有云)
    jaylengao
        19
    jaylengao  
       Sep 26, 2022   ❤️ 1
    单表 1.6E 跑的飞起。引入 cache ,数据库压力很小的
    itechnology
        20
    itechnology  
       Sep 26, 2022
    我的观点是,不是单表数据量达到了上亿就要分表,得看你的实际情况,大家说的要分表是因为性能已经不行了,不得不分表了,你这性能没有不行,所以我觉得暂时不用分表。
    INCerry
        21
    INCerry  
       Sep 26, 2022
    如上面所说,硬件 OK 的情况下单表上亿问题不大,后面如果数据量更大,可以考虑下面的分库分表中间件。
    https://github.com/dotnetcore/sharding-core
    ipwx
        22
    ipwx  
       Sep 26, 2022
    可以不动生产环境,但是可以开个模拟环境测试性能嘛。
    encro
        23
    encro  
       Sep 26, 2022
    看你记录类型和查询方式,可以考虑冷热分离方式。
    leafre
        24
    leafre  
       Sep 26, 2022
    会导致业务逻辑复杂度增加,不轻易使用分库分表

    不是达到多少数量量就一定要分库分表,主要看性能,性能不行了,没办法从其他方面优化了,万不得已可以考虑分库分表。
    leafre
        25
    leafre  
       Sep 26, 2022
    比如十亿数据表,单字段维度的过滤查询结果,查询时间 100ms 左右,根本不用考虑分表
    wdwwtzy
        26
    wdwwtzy  
       Sep 26, 2022
    听说 sqlserver 的优化更好,单表几亿几十亿都没问题?
    有人确认过吗?
    dcsuibian
        27
    dcsuibian  
       Sep 26, 2022
    没有性能问题就先别管它

    我之前有一个历史数据表,里面就是时间戳+关联 id+值,主要就是查询某个时间点的状态,建了索引(没建肯定慢的要死)

    测试时放了 8 亿条(或者是 4 亿条,记不清了),然后查了 1000 次,总共就花了 1 秒多,感觉够用了就没改
    sadfQED2
        28
    sadfQED2  
       Sep 26, 2022 via Android
    我前司,一张评论表 20 亿+数量,依然正常使用,uid 查询 10ms 以内
    roundgis
        29
    roundgis  
       Sep 26, 2022 via Android
    @az467 那可能是 20 年前的文章了 mysql 現在單表過億並無問題 我都試過
    cubecube
        30
    cubecube  
       Sep 26, 2022
    分表没啥用,除非你单机 cpu 扛不住的时候,分库顺便分表。
    leegradyllljjjj
        31
    leegradyllljjjj  
       Sep 26, 2022
    现在的人都喜欢瞎坤巴折腾,我们组就有个人就喜欢看见别入弄点啥都想拿来折腾一下,完全是闲着没事儿为了折腾而折腾,到时候出点线上问题你还得为他擦屁股背锅
    dog82
        32
    dog82  
       Sep 26, 2022
    要看表里的数据怎么用,如果只是按 id 查询就不要分
    nekoneko
        33
    nekoneko  
       Sep 26, 2022
    分表会搞得很麻烦, 系统不大的话不如分区, 跟分表是一样的效果.
    另外如果没有必要, 就不要分了
    ytmsdy
        34
    ytmsdy  
       Sep 26, 2022
    只要能跑,用户能接受,服务不奔溃就好了。
    有这闲工夫打打游戏不好么。
    tramm
        35
    tramm  
       Sep 27, 2022
    2 亿了, 加上索引, 没影响
    monetto
        36
    monetto  
       Sep 27, 2022
    我们线上库大概 10 亿级,是直接物理机部署的。2T SSD ,CPU 是啥忘记了 ... 运行一切良好。读写分离 + 单表。
    xshell
        37
    xshell  
       Sep 30, 2022
    @wdwwtzy
    大表(70 多个字段)五千多万查起来就卡了,SQL 特别要注意~
    还是物理机。
    用过的最多不到 3 亿,单表十几亿几十亿的没遇到过,。
    daoqiongsi1101
        38
    daoqiongsi1101  
       Oct 17, 2022
    分库分表场景可以用腾讯云 TDSQL
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2381 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 05:46 · PVG 13:46 · LAX 22:46 · JFK 01:46
    ♥ Do have faith in what you're doing.