随着业务的增长,数据库的数据量肯定也会随之增长,对MySQL来说,单表数据量在百万级别内存的读取效率还是可以的,但是当到达千万级别时效率会有较大降低,如果是复杂的查询操作,组合索引对于内存来说也是一笔很大的开销,这时就要从数据库层面优化,而常见的方式就是分库分表。
一、垂直拆分
表结构不一样
垂直分库:专库专用,按照业务将表进行分类,分布到不同的数据库上面,这种拆分往往伴随着服务化的改造,按功能模块将原来强耦合的系统拆分成多个弱耦合的服务,如订单服务、商品服务、交易服务,每个服务都有自己的库,存放业务相关的表。
垂直分表:这是针对数据表列进行拆分,表中列过多或者某些字段过长,占用空间较大,检索表的时候需要执行大量的IO,需要将长度较长的字段进行拆分,单独成表,用原表主键进行唯一标示。
优点:拆分后业务清晰、数据维护简单;
数据冷热分离、减少IO次数,提高检索效率;
缺点:部分业务表无法jion,需要接口实现、提高业务复杂性;
事务处理复杂;
二、水平拆分
分库分表,数据结构相同,按行数据以某种规则拆分到不同库或表中。
拆分规则:取模:找到某个字段,以某个字段取模后尽可能平均分布在不同的表中;(数据尽可能均匀,扩展麻烦)
日期:按指定日期放到指定的表中;(扩展容易,数据可能不均匀)
优点:解决单表单库数据量大、热点访问性能瓶颈的问题;
缺点:拆分规则相对复杂;
人为手工定位数据复杂;
数据多次扩展和数据迁移难度大;
小结:
- 数据表垂直拆分: 降低单表复杂度
- 数据库垂直拆分: 功能拆分
- 水平拆分:分表:解决单表大数据量问题。分库:为了解决单库性能问题。