如何设计分区分表策略?

如何设计分区分表策略?

5 个赞

分区分表策略设计概览

在 OceanBase 中,分区分表策略由 DDL 解析、优化器路由、存储层均衡与切分共同决定。核心包括:选择分区类型与分区键、定义一级/二级分区、利用分区裁剪与路由、以及通过均衡与预切分实现动态调整。

1. 分区类型与分区键选择

  • 支持的分区类型包括:HASH/KEY、RANGE(含 RANGE COLUMNS)、LIST(含 LIST COLUMNS),由 ObPartitionFuncType 标识,并在 DDL 解析时通过 resolve_partition_hash_or_keyresolve_partition_rangeresolve_partition_list 等函数处理具体定义 1 2
  • 分区键通过 resolve_part_func 解析并存储到 ObShardingInfopartition_keys_sub_partition_keys_,用于后续路由与裁剪 3 4

2. 一级与二级分区(复合分区)

  • 通过 part_level_ 区分一级(PARTITION_LEVEL_ONE)与二级(PARTITION_LEVEL_TWO)分区,二级分区可独立定义分区函数类型(如 RANGE + HASH) 5
  • DDL 解析支持模板化或独立定义二级分区,见 resolve_subpartition_elementsresolve_individual_subpartition 6

3. 分区裁剪与路由

  • ObTableLocation 负责根据查询条件计算目标分区/ tablet,支持多种计算节点(AND/OR/QueryRange)与生成列依赖 7 8
  • 优化器通过 ObShardingInfo 判断分区 wise join,并生成重分区(repartition)算子,实现跨分区数据重分布 9 10

4. 分区均衡与预切分

  • RootService 通过分区均衡策略在 Zone/Unit 间分布分区,测试用例展示了不同 sharding 策略(NONE/PARTITION/ADAPTIVE)对分区分布的影响 11 12
  • 预切分(ObPartitionPreSplit)根据 tablet 大小自动生成切分点并重建分区元数据,适用于分区规则变更或数据膨胀场景 13 14

5. 全局索引分区

  • 全局索引可独立定义分区策略(如 GLOBAL PARTITION BY HASH),与主表分区解耦,便于索引负载均衡 15

设计建议

  • 选型:高并发写入或键值查询优先用 HASH/KEY;时间序列或范围查询用 RANGE;枚举值或离散集合用 LIST。
  • 分区键:选择高基数且常作为查询条件的列,避免热点;复合分区时一级分区用于宏观划分,二级用于微观均衡。
  • 二级分区:在一级分区数据量仍过大时引入,常用 RANGE + HASH 组合。
  • 运维:利用预切分与均衡策略动态调整分区数量与分布,避免单点过载。

你可以用一下deepwiki 看看他给你的建议
https://deepwiki.com/search/_0fbc346f-49e8-4987-ab24-3390006ec2ff?mode=fast

3 个赞

分区分表是有一定策略的,学习了

3 个赞

默认就算分区表,在ob表里就是分区表,单表也是单分区的分区表啊

2 个赞

学习了

1 个赞

感谢分享

1 个赞

关于resolve的讨论很有价值,特别是在HASH场景下,合理使用RANGE是关键。