数据库的水平切分和垂直切分

链接:https://www.cnblogs.com/shijingxiang/articles/4601674.html

1、水平分割:

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

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

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

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

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

水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。

相对于垂直拆分,水平拆分不是将表的数据进行分类,而是按照某个字段的某种规则来分散到多个数据库中,每个表包含一部分数据。简单来说,也就是按照数据行进行切分,主要有分表和分库两种模式。

解决问题:
  单表中数据量增长出现的压力
  不解决问题:
  表与表之间的io争夺
 
方案:
用户表通过性别拆分为男用户表和女用户表
订单表通过已完成和完成中拆分为已完成订单和未完成订单
 

2、垂直分割:(专库专用)

按列分割,即把表按模块分到不同数据库表中(当然原则是不破坏第三范式),每个子表的行数相同

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

特点是规则简单,实施更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易的做到将不同业务模块所使用的的表拆分到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也简单清晰(这就是所谓的“share nothing”)。其实,相对于垂直切分更进一步的是服务化改造,说得简单点就是把原来强耦合的系统拆分成了多个弱耦合的服务,通过服务间的调用来满足业务需求。单表大数据量依然存在性能问题。

垂直拆分:
解决问题:
表与表之间的io竞争
不解决问题:
单表中数据量增长出现的压力
方案:
把产品表和用户表放到一个server上
订单表单独放到一个server上
 
通俗来讲:水平拆分行,行数据拆分到不同的表中;垂直拆分列,表数据按列拆分到不同表中。

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

猜你喜欢

转载自www.cnblogs.com/chen2608/p/10965565.html