• 为什么要分库分表?


    分析&回答

    什么是分库分表?

    • 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。
    • 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。

    为什么要分库分表?

    主要为了提升性能、增加可用性。

    分库分表前分库分表后
    并发支撑情况MySQL 单机部署,扛不住高并发MySQL从单机到多机,能承受的并发增加了多倍
    磁盘使用情况MySQL 单机磁盘容量几乎撑满拆分为多个库,数据库服务器磁盘使用率大大降低
    SQL 执行性能单表数据量太大,SQL 越跑越慢单表数据量减少,SQL 执行效率明显提升

    从性能上看

    随着单库中的数据量越来越大、数据库的查询QPS越来越高,相应的,对数据库的读写所需要的时间也越来越多。数据库的读写性能可能会成为业务发展的瓶颈。对应的,就需要做数据库性能方面的优化。

    如果数据库的查询QPS过高,就需要考虑拆库,通过分库来分担单个数据库的连接压力。比如,如果查询QPS为3500,假设单库可以支撑1000个连接数的话,那么就可以考虑拆分成4个库,来分散查询连接压力。

    如果单表数据量过大,当数据量超过一定量级后,无论是对于数据查询还是数据更新,在经过索引优化等纯数据库层面的传统优化手段之后,还是可能存在性能问题。这是量变产生了质变,这时候就需要去换个思路来解决问题,比如:从数据生产源头、数据处理源头来解决问题,既然数据量很大,那我们就来个分而治之,化整为零。这就产生了分表,把数据按照一定的规则拆分成多张表,来解决单表环境下无法解决的存取性能问题。

    从可用性上看

    单个数据库如果发生意外,很可能会丢失所有数据。尤其是云时代,很多数据库都跑在虚拟机上,如果虚拟机/宿主机发生意外,则可能造成无法挽回的损失。因此,除了传统的 Master-Slave、Master-Master 等部署层面解决可靠性问题外,我们也可以考虑从数据拆分层面解决此问题。

    此处我们以数据库宕机为例:

    • 单库部署情况下,如果数据库宕机,那么故障影响就是100%,而且恢复可能耗时很长。
    • 如果我们拆分成2个库,分别部署在不同的机器上,此时其中1个库宕机,那么故障影响就是50%,还有50%的数据可以继续服务。
    • 如果我们拆分成4个库,分别部署在不同的机器上,此时其中1个库宕机,那么故障影响就是25%,还有75%的数据可以继续服务,恢复耗时也会很短。

    当然,我们也不能无限制的拆库,这也是牺牲存储资源来提升性能、可用性的方式,毕竟资源总是有限的。

    反思&扩展

    如何分库分表?

    喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

  • 相关阅读:
    IDEA2022.3 @Slf4j cannot find symbol 无法解析问题处理
    阿里云国际站如何进行实名登记?
    Linux下 coredump 文件定位方法说明
    Pytorch查看、初始化网络层参数及模型的保存与加载
    【无标题】
    剑指 Offer II 061. 和最小的 k 个数对
    安全和监控中心管理制度
    可口可乐TCCC的验厂内容
    面向Java开发者的ChatGPT提示词工程(8)
    为什么前端要学 JavaScript ?JS都有哪些逆天的功能?
  • 原文地址:https://blog.csdn.net/jjclove/article/details/127391731