阿里的Java开发手册上提出:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表
1.InnoDB中B+树的高度一般保持在三层以内会比较好”
MySQL每个节点大小默认为16KB,也就是每个节点最多存16KB的数据
水平分表(Horizontal Partitioning)是数据库分片的一种方法,通过将数据按行(记录)进行拆分,从而将表的数据分布到多个物理存储节点上。常见的水平分表策略有以下几种:
1. 范围分表(Range Partitioning)
按照某个列的值的范围进行分表。例如,可以按照日期范围将订单表拆分为不同的子表:
orders_2020
表存储 2020 年的订单orders_2021
表存储 2021 年的订单
优点
- 适合有明显范围划分的数据
- 易于理解和管理
缺点
- 数据倾斜风险大(某些范围的数据量可能会过大)
- 随时间推移需要不断创建新的分区
2. 哈希分表(Hash Partitioning)
按照某个列的哈希值进行分表。例如,可以按照用户 ID 的哈希值将用户表拆分为多个子表:
user_0
表存储哈希值为 0 的用户user_1
表存储哈希值为 1 的用户- …
优点
- 数据分布相对均匀,减少数据倾斜
- 查询性能较稳定
缺点
- 复杂查询(如范围查询)性能较差
- 增加和删除分区复杂
3. 列值分表(List Partitioning)
按照某个列的离散值进行分表。例如,可以按照用户的地区将用户表拆分为不同的子表:
user_asia
表存储亚洲用户user_europe
表存储欧洲用户
优点
- 易于管理和理解
- 特定区域的数据可以集中存储和管理
缺点
- 数据倾斜风险大(某些离散值的数据量可能会过大)
- 需要预先定义好分区策略
4. 复合分表(Composite Partitioning)
结合多种分表策略进行分表。例如,可以先按照日期进行范围分表,然后再对每个范围分区按照用户 ID 进行哈希分表:
orders_2020_0
表存储 2020 年的订单且哈希值为 0orders_2020_1
表存储 2020 年的订单且哈希值为 1- …
优点
- 更加灵活和高效,适应复杂的业务需求
- 能更好地控制数据分布和查询性能
缺点
- 复杂度高,难以管理
- 维护成本较高
5. 一致性哈希分表(Consistent Hashing)
使用一致性哈希算法,将数据分布在多个节点上。常用于分布式系统,如分布式缓存和分布式数据库。
优点
- 动态增减节点时,数据迁移量较小
- 能较好地保证数据均匀分布
缺点
- 实现复杂
- 需要配合分布式系统使用
6. 模(Modulo)分表
按照某个列的值取模进行分表。例如,可以按照用户 ID 取模的结果将用户表拆分为多个子表:
user_0
表存储 ID % 3 == 0 的用户user_1
表存储 ID % 3 == 1 的用户user_2
表存储 ID % 3 == 2 的用户
优点
- 实现简单
- 数据分布均匀
缺点
- 扩展性差(增加分区时需要重新计算模)
- 难以处理复杂查询
总结
选择水平分表策略时,需要根据具体的业务需求和数据特点来决定。常见的考虑因素包括:
- 数据分布的均匀性
- 查询和更新操作的频率和类型
- 系统的扩展性要求
- 数据倾斜和热点问题
综合考虑这些因素,可以选择合适的分表策略来优化数据库性能和可扩展性。
参考文章:https://blog.csdn.net/xiaowanzi_zj/article/details/122270389