垂直切分(分库)

按照不同的表或者业务域切分到不同的数据库中。

优点(相对而言):

  • 业务清晰,规则明确
  • 系统之间易扩展
  • 数据维护简单

缺点:

  • 跨库无法 join,只能通过接口调用。
  • 跨库事务难以处理
  • 如果单表数据过大,仍然存在单体性能瓶颈

水平切分(分表)

一个表中的数据,按照某种规则拆分到不同数据库中。

常见拆分,使用某个字段 求模

优点:

  • 解决了单表大数据,高并发瓶颈
  • 拆分规则封装好,对应用端几乎透明

缺点:

  • 跨库无法 join
  • 拆分规则很难抽象
  • 分片事务一致性难以解决
  • 二次扩展时,数据迁移、维护难度大。
    • 比如一开始根据 id 对2求模,但随着数据量增长,需要拆分4个数据库,这时就需要做数据迁移

总结

无论是垂直拆分还是水平拆分,都有共同缺点:

  • 跨库无法 join
  • 分布式事务
  • 多数据源管理

针对多数据源管理:

  • 客户端模式:每个应用模块内,配置自己需要的数据源,直接访问数据库,在各模块内完成数据整合
    • sharding-jdbc
  • 中间代理模式:代理统一管理所有数据源,数据库层对开发人员透明
    • MyCat
    • sharding-proxy