低调人的gravatar头像
低调人 2017-02-14 14:46:07
数据库的水平分割和垂直分割

数据库操作中,我们常常会听说这两个词语:水平分割垂直分割。那么到底什么是数据库的水平分割,什么是数据库的垂直分割呢?本文我们就来介绍一下这部分内容。

1、水平分割:

按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。

水平分割通常在下面的情况下使用:

A 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。

B 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。

C需要把数据存放到多个介质上。

例如法规表law就可以分成两个表active-law和 inactive-law。activea-authors表中的内容是正生效的法规,是经常使用的,而inactive-law表则使已经作废的法规,不常被查询。水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。

2、垂直分割:

按列进行分割,即把一条记录分开多个地方保存,每个子表的行数相同。

把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O 次数。其缺点是需要管理冗余列,查询所有数据需要join操作。 

例如有表T1

id  name  qty

--------------

1  p1    10

2  p2    20

3  p3    30

4  p4    40

......

......

垂直分割就是按列进行分割,即把一条记录分开多个地方保存,每个子表的行数相同。

例如表T1,可以把id和name放到数据文件p1,把qty放到数据文件p2。

水平分割就是按记录进分分割,不同的记录可以分开保存,每个子表的列数相同。

像表T1,可以把id为单数的放到数据文件P1,双数的放到数据文件P2。

表散列与水平分割相似,但没有水平分割那样的明显分割界限,它由哈希函数和键值决定一条记录的保存文件,这样是为了IO更加均衡。

关于数据库的垂直分割与水平分割的知识就介绍到这里了,希望本次的介绍能够对您有所收获!

http://database.51cto.com/art/201108/282431.htm

 

数据库水平拆分和垂直拆分区别(以mysql为例)

 

案例:

    简单购物系统暂设涉及如下表:

1.产品表(数据量10w,稳定)

2.订单表(数据量200w,且有增长趋势)

3.用户表 (数据量100w,且有增长趋势)

以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万

 

垂直拆分:

解决问题:

表与表之间的io竞争

不解决问题:

单表中数据量增长出现的压力

方案:

把产品表和用户表放到一个server上

订单表单独放到一个server上

 

水平拆分:

解决问题:

单表中数据量增长出现的压力

不解决问题:

表与表之间的io争夺

 

方案:

用户表通过性别拆分为男用户表和女用户表

订单表通过已完成和完成中拆分为已完成订单和未完成订单

产品表 未完成订单放一个server上

已完成订单表盒男用户表放一个server上

女用户表放一个server上(女的爱购物 哈哈)


打赏

已有2人打赏

人间蒸发的gravatar头像 已注销用户的gravatar头像
最近浏览
人间蒸发  LV23 2020年4月1日
已注销用户  LV34 2020年4月1日
javaggm  LV13 2019年9月17日
Chrishi  LV4 2019年1月24日
dongzhan  LV12 2019年1月21日
西洲尐  LV10 2018年12月10日
986871510  LV11 2018年11月9日
feia1236  LV10 2018年8月13日
公子千  LV6 2018年8月1日
世子胡亥  LV5 2018年7月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友