【分库分表问题————水平分表】

阿里的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 年的订单且哈希值为 0
  • orders_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

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值