zoukankan      html  css  js  c++  java
  • MySQL 水平拆分与垂直拆分详解

    前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分。

    一、垂直拆分

    说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。
    
    解释:专库专用
    
    优点:
        1、拆分后业务清晰,拆分规则明确。
        2、系统之间整合或扩展容易。
        3、数据维护简单。
    
    缺点:
        1、部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。
        2、受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
        3、事务处理复杂。

      结构图

      

    二、水平拆分

    说明:垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。
    
    解释:相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。
       简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,主要有分表,分库两种模式:

    优点:
      1. 不存在单库大数据,高并发的性能瓶颈。
      2. 对应用透明,应用端改造较少。
    3. 按照合理拆分规则拆分,join操作基本避免跨库。
    4. 提高了系统的稳定性跟负载能力。

    缺点:
      1. 拆分规则难以抽象。
      2. 分片事务一致性难以解决。
      3. 数据多次扩展难度跟维护量极大。
      4. 跨库join性能较差。

    拆分方案:
      范围、枚举、时间、取模、哈希、指定等

     分库结构图

     

      分表结构图

      

    三、2种方式的共同缺点

    1. 引入分布式事务的问题。(关于跨库事务,在设计的时候就应该避免这样的问题,不过也有解决方案,如MySQL自带的XA事务(效率很低),java的JTA)
    2. 跨节点Join 的问题。(分开查,设计的时候就应该允许部分数据冗余)
    3. 跨节点合并排序分页问题。(同上)

    四、总结

    1、不管是垂直还是水平切分,尽量不拆分。
    2、如果非要拆分,先垂直,后水平。
    3、垂直拆分解决表与表之间的io竞争。
    4、水平拆分解决单表中数据量增长出现的压力。

    以上就是对垂直拆分和水平拆分的一些学习,欢迎补充和讨论。

     对于不是很理解的人,可以看看下面的参考链接

    参考链接:http://www.cnblogs.com/firstdream/p/6728106.html

  • 相关阅读:
    Ubuntu18.04可执行文件运行提示No such file or directory
    Linux gcc(ar命令)打包库到另一个库中的另外一种方法
    干干净净的grep
    C语言里面和时间有关的函数
    Ubuntu上安装tftp服务
    因为新冠,宅家2周,折腾了一下电视盒子。
    批量处理文件的Python程序
    Windows 10中使用VirtualBox
    重采样Resample 的一些研究记录。
    微信公众号接入第三方服务器,设置自动回复、关键回复、自定义菜单,配置及开发流程
  • 原文地址:https://www.cnblogs.com/chenhaoyu/p/10737603.html
Copyright © 2011-2022 走看看