1.为什么要分库分表
当mysql中表较多,表字段较多,单表的数据量较大的时候会降低mysql系统的性能,mysql建议单表的数量保持在500-1000W之间,超过1000万会影响mysql系统的性能。
2.数据库的拆分方式
2.1垂直拆分
垂直分库:将1个库中的表分开两个库存储;解决单库表较多的问题
垂直分表:将一个表的字段拆分到两个表存储;解决单表字段较多的问题
2.2水平拆分
将大数据表拆分成小表;解决单表数据量较大的问题
3.拆分策略
垂直拆分:
根据领域模型拆分,如将用户表存储在一个数据库中,订单表存储一个库中
水平拆分:
一致性hash 如对id hash取模,如果集群中增加会减少节点会涉及到节点的数据迁移的问题。
范围拆分 例如按照id的范围拆分。
日期拆分 如对订单表1个月存储在一个表中。
4.拆分带来的问题
4.1 跨库的join的问题
1.在设计的时候考虑到应用层的join问题
2.在应用层去做调用 如select u.,o. from user u left join order o on u.id=o.user_id;
可以先查询user的id,之后通过userId查询的订单
3.全集表 如数据字典表可以在每个数据库节点都存储一份
4.字段的冗余;如可以把用户名字可以在表中冗余一份(空间换时间的算法)
4.2 跨库的数据排序和分页问题
4.3 唯一主键问题;拆分之前表的主键是自增的,拆分之后会导致id重复的问题。
1.uuid 此方式性能较低,因为uuid较长会降低索引的性能。
2.snowflake
3.mongodb
4.redis incyby
4.4 分布式事物问题
多个数据库节点的数据一致性问题,一般用强一致性分布式事物的比较少,用最终一致性的较多。