1. 切分
一般情况下说的水平切分、垂直切分,都是指的数据库层面。
随着业务量的增加,数据量肯定快速增长,拿MySQL来说,单表数据量在百万级内存读取效率还是可以的,可以一旦达到千万级,性能会有较大的降低。如果是复杂的查询操作,那么组合索引对于内存来说也是一笔很大的开销。这个时候就需要从数据库层面来进行优化了。
普遍采用的方式就是数据库 垂直拆分 + 水平拆分的方式来进行改造。
1.1 垂直拆分
数据库的垂直拆分: 对业务表进行分类,不同的业务表划分到不同的数据库里。这种形式的拆分往往是便随着服务化改造,按功能模块将原来强耦合的系统拆分为多个弱耦合的服务,此时往往就会进行数据库的垂直拆分。
数据表的垂直拆分: 是针对于数据表列的拆分,把一张列比较多的表拆分为多张表。比如可以将
垂直拆分的优点:
- 数据库的拆分简单明了,拆分规则明确。
- 应用程序模块清晰明确,整合容易。
- 数据维护方便易行,容易定位。
垂直拆分的缺点:
- 部分表关联无法在数据库级别完成,需要在程序中完成。
- 单表大数据量仍然存在性能瓶颈。
- 事务处理相对更为复杂。
- 拆分达到一定程度之后,扩展性会遇到限制。
水平拆分
水平拆分:分库分表,把一个表的数据按照某种规则化分到不同表或数据库里。(水平拆分 是按照行数据拆分)。 拆分规则:取模、年份等。
水平拆分的优点:
- 解决单表单库大数据量和高热点访问性能遇到瓶颈的问题;
- 应用程序端整体架构改动相对较少。
- 事务处理相对简单。
- 只要切分规则能够定义好,基本上较难遇到扩展性限制。
水平拆分缺点:
- 拆分规则相对更复杂,很难抽象出一个能够满足整个数据库的切分规则。
- 后期数据的维护难度有所增加,人为手工定位数据更困难。
- 产品逻辑将变复杂。比如按年来进行历史数据归档拆分,这个时候在页面设计上就需要约束用户必须要先选择年,然后才能进行查询。
总而言之:
- 数据表垂直拆分: 单表复杂度。
- 数据库垂直拆分: 功能拆分。
- 水平拆分:分表:解决单表大数据量问题。 分库:为了解决单库性能问题。
https://www.cnblogs.com/beyondbit/p/6973199.html
https://www.cnblogs.com/happyday56/p/3862804.html
http://blog.csdn.net/mchdba/article/details/46278687