- 何时需要分库分表
只有当性能出现瓶颈,且无法通过优化方法提升性能的时候才考虑分库分表,即这是最后的方法;常见的优化方法就包括新增索引、优化索引、新增从库、读写分离
- 瓶颈
单表瓶颈--表数据量太大,出现读写性能问题
单库瓶颈--CPU压力过大,内存压力过大,磁盘空间不足
- 表的切分策略
1.范围切分 根据某个字段的范围进行切分,比如ID,id在0~1000万在A表,1000~2000万在B表这种方式,有热点问题,写操作主要都集中在最后一张表
2.中间表映射 维护一张分库分表的键与数据库表的映射关系,在查询和更新数据之前先查询这张表的数据,问题就是这张表的读压力过大,而且引入了新的节点,增加了复杂度
3.Hash切分 通过对分库分表键进行一定的运算,比如取模运算,决定路由到哪张数据库表,优点是数据分片较为均匀,读写操作也较为均匀,但也可能会存在跨节点查询以及分页的问题
相关工具与技术
- binlog同步 原新数据库数据同步 canal
- 分库分表工具
1.客户端直连数据库 Sharding-JDBC TDDL
2.数据库代理 MyCat
- 分库分表问题
1.分布式ID问题
UUID因为数据不是严格递增的,因为聚簇索引的问题,因此插入数据及查询数据会有性能问题,可以使用雪花算法或号段模式。
号段模式--每次从数据库中读取一批的ID,将ID放入分布式缓存中,使用完毕后及时删除,全部使用后申请下一批ID
- 分布式事务问题
- 跨库join以及分页问题