文档章节

MySQL 水平拆分与垂直拆分详解

o
 osc_gu9d45li
发布于 2019/04/22 15:38
字数 820
阅读 20
收藏 0

精选30+云产品,助力企业轻松上云!>>>

前言:说到优化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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
MySQL Sharding 详解

背景 我们知道,当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大。采用MySQL Replication多mater多salve方案,在上层做负载均衡,虽然能够一定程度上缓解压力。但是当一...

nao
2016/03/07
187
0
Mycat垂直拆分与水平拆分

垂直拆分: 垂直拆分是根据数据库里面的数据表的业务进行拆分,比如:一个数据库里面既存在用户数据,又存在订单数据,那么垂直拆分可以把用户数据放入到用户库,把订单数据放到订单库。垂直...

osc_qukgacve
2019/10/15
4
0
分库分表

分库分表前的问题 任何问题都是太大或者太小的问题,我们这里面对的数据量太大的问题。 用户请求量太大 因为单服务器TPS,内存,IO都是有限的。 解决方法:分散请求到多个服务器上; 其实用户...

i不歪
2019/12/06
22
0
Mysql在大型网站的应用架构演变

写在最前: 本文主要描述在网站的不同的并发访问量级下,Mysql架构的演变 可扩展性 架构的可扩展性往往和并发是息息相关,没有并发的增长,也就没有必要做高可扩展性的架构,这里对可扩展性进...

osc_qw0lto72
2018/11/20
1
0
mysql水平拆分和垂直拆分

https://baijiahao.baidu.com/s?id=1607944199335196177&wfr=spider&for=pchttps://www.cnblogs.com/firstdream/p/6728106.html数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分,......

osc_99vlkukb
2019/12/06
2
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么从HBase的0.96版本开始,舍弃了-ROOT-文件?

HBase结构的读写流程 (1). HBase0.96版本之前: (2). HBase0.96开始: a. 当客户端获取到.meta文件的位置之后,会缓存.meta.文件的位置 b. 客户端还会缓存HRegion的位置 -ROOT-存在的意义: ...

其乐m
20分钟前
12
0
volatile关键字对 - What is the volatile keyword useful for

问题: At work today, I came across the volatile keyword in Java. 今天的工作中,我遇到了Java中的volatile关键字。 Not being very familiar with it, I found this explanation: 不太熟......

技术盛宴
25分钟前
25
0
golang 封装 mysql 和 redis 连接

Mysql封装 package dbimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")var DB *sqlx.DBfunc init(){database, err := sqlx.Op......

开源中国最牛的人
25分钟前
16
0
pdfbox 读取文件报错 java.io.IOException: Page tree root must be a dictionary

pdfbox java.io.IOException: Page tree root must be a dictionary 示例代码 public static void main(String[] args) { try (InputStream sampleInputs = new ClassPathResource("s......

lemos
34分钟前
28
0
整理 Linux下列出目录内容的命令

在 Linux 中,有非常多的命令可以让我们用来执行各种各样的任务。当我们想要像使用文件浏览器一样列出一个目录下的内容时,大家第一时间想到的是 ls 命令。但只有 ls 命令能实现这个目的吗?...

良许Linux
35分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部