GaussDB 分片和分区策略
HASH 分布 | 根据分布键的哈希值,将数据均匀映射到各个节点,是 默认推荐 的方式 。 | 数据量大、更新频繁、查询多为等值条件(如
)的业务表,如订单表、用户表 。 |
|
RANGE 分布 | 将分布键的值划分为连续的区间,每个区间对应一个节点 。 | 数据有明显有序特征(如时间、地区),且频繁进行 范围查询 的场景,如日志表、监控数据表 。 |
|
LIST 分布 | 将分布键的 具体值 映射到指定节点,例如将特定省份的数据存放到固定节点 。 | 需要按业务定义的离散值(如地区、状态码)进行数据隔离或路由的场景 。 |
|
REPLICATION 分布 | 复制表 ,在每个节点上都保存一份完整的数据副本,并非真正意义上的分片 。 | 数据量不大(如小于2000万行)、更新频率低、但被频繁关联查询的小表,如字典表、配置表 。 |
|
注意:REPLICATION 表会造成存储空间膨胀(每节点一份全量),且更新时所有节点同步,会影响写入性能,需要谨慎使用。
二、表分区策略(单节点内部分区)
这是在单个数据节点内部,进一步对表进行水平拆分的方式,主要用来提升查询性能和维护便捷性(如快速删除历史分区)。GaussDB 支持以下几种分区类型:
- 范围分区:根据数据范围(如日期、数值区间)将数据划分到不同分区,是最常用的分区方式。
- 列表分区:根据离散的值列表进行分区,例如按业务类型、地区代码分区。
- 哈希分区:通过哈希算法将数据均匀分布到多个分区,用于打散热点数据。
- 间隔分区:一种特殊的范围分区,当插入的数据超出已有范围时,数据库会自动创建新分区,极大简化了按时间分区的维护工作。
- 二级分区:在上述一级分区的基础上,再嵌套一层分区,例如先按 范围分区(按年),再按 哈希分区(按用户ID),以应对更复杂的场景。
💡 区分要点:
- 分布策略决定了数据存储在哪台机器上,解决的是横向扩展问题。
- 表分区决定了数据在单台机器内部如何组织,解决的是单表管理和查询剪枝问题。
三、分片键选择的核心原则
分片键(分布键)的选择是 GaussDB 设计中最关键的一环,直接影响系统性能。主要遵循以下原则:
- 数据均匀:选择取值离散且分布均匀的列(如用户ID),避免数据倾斜导致部分节点过载。
- 贴合查询:高频查询的 WHERE 条件中应包含分片键,实现“单点命中”,避免 SQL 下发到所有节点执行(即“读放大”)。
- 利于关联:对于经常 JOIN 的大表,尽量选择相同的列作为分片键,使关联操作在节点内本地完成,大幅减少跨节点数据传输。
- 避免更新:分片键的值一旦插入,不建议更新。更新分片键可能导致数据需要在节点间迁移,带来严重的性能开销。
- 控制数量:复合分片键不宜超过3列。
查看22道真题和解析