垂直分割
当一个表的字段过多,而且数据量过大的时候,为了提高性能,就得考虑对表进行垂直分割了。
所谓的垂直分割,其实就是把一个原先有很多列(字段)的表拆分开来,解决表的宽度问题。
基本原则:
- 把 不常用的字段 单独放一个表中;
- 把 大字段 单独放一个表中;
- 把经常一起使用的字段放到一个表中;
- 把经常需要参与筛选条件的字段放到主表中;
优点:
- 数据库的拆分简单明了,拆分规则明确;
- 应用程序模块清晰明确,整合容易;
- 数据维护方便易行,容易定位;
缺点:
- 可能需要建立关联表,部分表关联无法在数据库级别完成,需要在程序中完成;
- 对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,不一定能满足要求;
- 事务处理相对更为复杂;
- 切分达到一定程度之后,扩展性会遇到限制;
示例一:在 Users 表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段。那么,为什么不把他放到另外一张表中呢?
示例二: 你有一个叫 “last_login” 的字段,它会在每次用户登录时被更新。但是,每次更新时会导致该表的查询缓存被清空。所以,你可以把这个字段放到另一个表中,这样就不会影响你对用户ID,用户名,用户角色的不停地读取了,因为查询缓存会帮你增加很多性能。
水平分割
将某个访问极其频繁的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。
优点:
- 表关联基本能够在数据库端全部完成;
- 不会存在某些超大型数据量和高负载的表遇到瓶颈的问题;
- 应用程序端整体架构改动相对较少;
- 事务处理相对简单;
- 只要切分规则能够定义好,基本上较难遇到扩展性限制;
缺点:
- 切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;
- 后期数据的维护难度有所增加,人为手工定位数据更困难;
- 应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难;