水平切分和垂直切分的理解
前言
做数据库分表的时候,总是能看到水平切分、垂直切分,但是并不能理解何为水平、何为垂直。仅此做个记录。
1.切分
一般情况下说的水平切分、垂直切分,都是指的数据库层面的。
随着业务量的增加,数据量肯定快速增长,拿Mysql来说,单表数据量在百万级内读取效率还是可以的,可是一旦达到千万级,性能会有较大的降低。如果是复杂的搜索,那么组合索引对于内存来说也是一笔很大的开销。这个时候就需要从数据库层面来进行优化了。
普遍采用的方式就是数据库 垂直切分+ 水平切分的方式来进行改进。
1.1垂直切分
垂直拆分:原来一个表的信息,拆分到两个或者多个表中,通过主键来进行关联。(垂直拆分列,列数据拆分到不同表中)
垂直切分的优点
- 数据库的拆分简单明了,拆分规则明确;
- 应用程序模块清晰明确,整合容易;
- 数据维护方便易行,容易定位;
垂直切分的缺点
- 部分表关联无法在数据库级别完成,需要在程序中完成;
- 单表大数据量仍然存在性能瓶颈;
- 事务处理相对更为复杂;
- 切分达到一定程度之后,扩展性会遇到限制;
1.2水平切分
水平切分:把一个表的数据按照某种规则划分到不同表或数据库里。(水平拆分行,行数据拆分到不同表中)
水平切分的优点
- 解决单表大数据量性能遇到瓶颈的问题;
- 应用程序端整体架构改动相对较少;
- 事务处理相对简单;
- 只要切分规则能够定义好,基本上较难遇到扩展性限制;
水平切分的缺点
- 切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;
- 后期数据的维护难度有所增加,人为手工定位数据更困难;
- 应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。
2.扩展
一般情况下说的水平扩展、垂直扩展,都是指的服务层面的。
当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展。选用哪种策略主要依赖于要解决的问题 以及系统资源的限制。
2.1垂直扩展
在垂直扩展模型中,想要增加系统负荷就意味着要在系统现有的部件上下工夫,即通过提高系统部件的能力来实现。
比如增加机器的内存,提高单机处理能力,拆分功能到不同的机器上部署等等。
垂直扩展旨在提高自身效率,但总会遇到自身的瓶颈。
2.2水平扩展
在水平扩展模型中,通过增加更多的系统成员来实现。也就是通常所说的加机器。
当你的大量请求并发的时候,可以通过分布式的方式,让请求均匀的分布到不同的机器上,减小压力。
总结
简而言之:
垂直扩展:拆分功能为小功能,来转移压力的发生。
水平扩展:复制相同的表、库、服务器来共同承担压力。