分库分表
使用场景:mysql单表1500万以上需要分表 当数据库容量达到实例的三分之二需要分库
水平分表
同一个库中,单表数据量过大,影响查询效率时,创建多个表,表结构和类型不变,如订单表order_1 order_2,可以使用商品id%num+1(num是表的拆分数量)
水平分库
创建多个库,库里面的表数量和类型不变,在单个库容量超过实例的三分之二后考虑,可以使用商家id%num+1算法或者年份%num+1(num是库的拆分数量)
垂直分表
同一个库中,单表热数据和冷数据拆分多个表分别存储,独立维护,如微博信息表中内容和回复/点赞分开存储
垂直分库
每个库单独存储部分表,如订单表,库存表,商品表放入不同的库
分库分表带来的问题
- id重复,可以用snowflake算法解决
- 分布式事务带来的数据一致性问题
- 多表关联查询,影响性能
Sharding-sphere实现分库分表
sharding-sphere整体设计是jdbc的增强,通过sql解析和sql转换,交给jdbc执行最终的sql语句
sharding-sphere需要提前设计好水平分库分表的规则和字段,在不更改sql的情况下,完成数据的更新和查询
在3.0之前处理部分表进行分库分表,部分不分库分表的方法是把分库分表相关业务放到单独的service模块,最新的sharding-sphere解决了该问题