决策:选择哪种分区策略?
分区将一张大表在同一个逻辑名称下拆分为多个物理片段,便于删除旧数据,并让查询只访问相关片段(分区裁剪,partition pruning)。但在小表上,它只会增加复杂性。这棵决策树首先质疑是否真的需要分区,然后根据访问和分布模式引导你在 Range、List、Hash 和 Composite 之间做出选择。
表是否真的大到需要分区?
分区不是性能魔法;它是一种规模和维护(生命周期)工具。如果表不够大,或者查询借助索引已经表现良好,分区只会带来执行计划复杂性和管理开销。你的表是否达到数千万行以上/数百 GB,还是仍然是小/中型?
- 是的,表非常大,和/或需要批量删除/归档旧数据
- 不,小/中型表,或者我不确定
你如何访问数据,应该如何拆分?
分区键应当是大多数查询用于过滤的列;只有这样分区裁剪才会生效。主要的访问模式是什么?按日期/连续范围(最近 30 天),按特定的类别/区域值,还是没有明确的过滤条件、希望均匀分布负载?
- 日期/序列号等连续范围(最近 X 天、按月)
- 类别/区域/租户等离散值集合
- 没有明确的范围/类别;目标是均匀分布负载
- 既按日期又数据量大;需要在两个维度上拆分
建议:(暂时)不要分区
分区对小/中型表没有好处;选好索引并进行正常维护就足够了。过早分区会使查询计划复杂化,选错键会导致无法裁剪,并增加运维开销。
建议:Range 分区
Range 分区按某列的连续范围拆分行(例如日期范围:每月/每季度一个分区)。它是时序数据和持续增长的表最常用、最强大的策略。
建议:List 分区
List 分区按某列的离散已知值对行分组(例如 region = 'TR','EU','US' 或租户 ID)。当存在自然、有限的类别时,它使访问和管理变得清晰。
建议:Hash 分区(均匀分布)
Hash 分区根据键列的哈希值,将行相对均匀地分布到预先定义数量的分区中。在没有自然范围/类别时,用于避免热点并平衡负载。
建议:Composite(多级)分区
复合分区结合了两种策略:先在顶层拆分,再将每个分区划分为子分区(例如 Range-by-Hash 或 Range-by-List)。当同时需要基于时间的生命周期管理和均匀分布/类别隔离时使用。