• 垂直切分:分库,订单、用户、商品表等
  • 水平切分:将同一个表中的不同数据拆分到不同的数据库当中。规则更复杂,后期数据维护也会比较麻烦

    要想做到数据的水平切分,那么在每一个表中必须要用冗余字段作为切分依据和标记字段

水平拆分规则:

  • 号段分区()

ID为110000的放入DB1, ID为1000120000的放入DB2,以此类推
优点:可部分迁移
缺点:数据分布不均

  • hash取模区分区()

对ID进行hash,然后将得到的hash对一个特定的数字进行取模运算,比如说hashcode%4假如结果为0就放入DB1,结果为1就放入DB2,以此类推。
优点:数据分布均匀
缺点:数据迁移的时候比较麻烦,不能按照机器性能分摊数据

  • 在认证库中保存数据库配置(路由表)

建立一个DB,这个DB单独保存特定ID到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行我们需要的操作。
优点:灵活性强,一对一关系
缺点:每次查询之前都要多一次查询,性能大打折扣

分库分表带来的问题及其解决办法

  • 分布式事务问题:使用两阶段提交协议

网络上的交互次数的增多以及引入事务管理器的开销,是使用两阶段提交协议使得分布式事务的开销增大的两个方面。因此,在进行垂直拆分和水平拆分后,需要想清楚是否一定要引入两阶段的分布式事务,在必要的情况下才建议使用。

  • 多机Sequence问题:连续性和唯一性:UUID、统一的ID生成器
  • 跨库Join问题:
    • 在应用层把原来数据库中的Join操作分成多次数据库操作
    • 数据冗余