如何设计分区分表策略?
5 个赞
分区分表策略设计概览
在 OceanBase 中,分区分表策略由 DDL 解析、优化器路由、存储层均衡与切分共同决定。核心包括:选择分区类型与分区键、定义一级/二级分区、利用分区裁剪与路由、以及通过均衡与预切分实现动态调整。
1. 分区类型与分区键选择
- 支持的分区类型包括:HASH/KEY、RANGE(含 RANGE COLUMNS)、LIST(含 LIST COLUMNS),由
ObPartitionFuncType标识,并在 DDL 解析时通过resolve_partition_hash_or_key、resolve_partition_range、resolve_partition_list等函数处理具体定义 1 2 。 - 分区键通过
resolve_part_func解析并存储到ObShardingInfo的partition_keys_与sub_partition_keys_,用于后续路由与裁剪 3 4 。
2. 一级与二级分区(复合分区)
- 通过
part_level_区分一级(PARTITION_LEVEL_ONE)与二级(PARTITION_LEVEL_TWO)分区,二级分区可独立定义分区函数类型(如 RANGE + HASH) 5 。 - DDL 解析支持模板化或独立定义二级分区,见
resolve_subpartition_elements与resolve_individual_subpartition6 。
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是关键。