- 垂直切分:分库,订单、用户、商品表等
- 水平切分:将同一个表中的不同数据拆分到不同的数据库当中。规则更复杂,后期数据维护也会比较麻烦
要想做到数据的水平切分,那么在每一个表中必须要用冗余字段作为切分依据和标记字段
水平拆分规则:
- 号段分区()
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操作分成多次数据库操作
- 数据冗余