MySQL分库分表实践
2024年1月1日
分库分表
一、什么时候分库、什么时候分表
- 分表:单张数据表太大,大于 500w 以上,影响了事务执行效率,就需要考虑分表。
- 分库:单个数据库的性能扛不住高并发流量,就要考虑分库。
二、分库分表原理
具体可以分为两种方式:垂直切分和水平切分
(一) 垂直切分
垂直拆分一般是按照业务和功能的维度进行拆分,把数据分别放到不同的数据库中。

(二) 水平切分
水平拆分是把相同的表结构分散到不同的数据库和不同的数据表中,避免访问集中的单个数据库或者单张数据表,具体的分库和分表规则,一般是通过业务主键,进行哈希取模操作。

三、分库分表引发的问题
(一) 分布式事务问题,解决方式:
分布式事务是指:一次大的操作由多个小操作组成,这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
- 2PC 两阶段、3PC 三阶段提交协议。(强一致性,性能差,用的少)
- TCC 分段提交
- 基于本地消息表来实现分布式事务(最终一致性,性能较好,用的多)
(二) 全局 ID 唯一性问题,解决方式:
- 雪花算法生成 ID
- 美团 leaf 算法
(三) 跨库跨表关联查询问题,解决方式:
(四) 跨库跨表 count 查询问题,解决方式