doris数据分片逻辑
Apache Doris 的数据分片逻辑采用多级分区策略,通过分区(Partition)+分桶(Bucket) 的复合机制实现数据高效管理与查询优化,具体逻辑如下:
一、分层逻辑架构
-
分区 (Partition)
- 作用:按业务场景划分数据范围,支持时间范围分区(如按天/月)或 枚举值分区(如按地区/类型)
- 优势:通过分区剪枝减少查询扫描范围,例如查询某时段数据时仅需扫描对应分区
- 语法示例:
PARTITION BY RANGE(date) (PARTITION p202305 VALUES [('2023-05-01'), ('2023-06-01')))
-
分桶 (Bucket)
- 作用:在分区内进一步将数据划分为逻辑分桶,支持 哈希分桶(按指定列哈希)或 随机分桶
- 优势:保证数据均匀分布,并行计算时负载均衡,提升查询效率
- 语法示例:
DISTRIBUTED BY HASH(user_id) BUCKETS
-
Tablet
- 定义:分桶后的最小物理存储单元,每个分桶对应多个 Tablet
- 特性:支持多副本存储(默认3副本),保障数据可靠性和查询高可用性
二、数据分布策略
- 横向扩展:分区支持动态增删,适应时间序列数据增长需求
- 纵向切分:分桶数量和字段可配置,优化不同查询模式(如高频点查选择高基数列分桶)
- 负载均衡:数据自动均匀分布到集群节点,避免热点问题
三、典型应用场景
时序数据存储
按时间分区后哈希分桶,加速时间范围过滤与聚合查询
高并发点查
选择高基数列(如用户ID)分桶,利用前缀索引快速定位数据块
宽表分析
随机分桶分散存储压力,结合列式存储优化复杂查询性能
四、示例分片流程
-- 创建复合分区表
CREATE TABLE user_behavior (date DATE,user_id INT,action VARCHAR(20)
)
PARTITION BY RANGE(date) (PARTITION p202305 VALUES [('2023-05-01'), ('2023-06-01'))
)
DISTRIBUTED BY HASH(user_id) BUCKETS 8;
物理存储:每个 user_id 哈希值映射到 8 个分桶,每个分桶对应多个 Tablet,最终存储为物理文件
查询优化:查询 date='2023-05-15' AND user_id=123 时,仅扫描 p202305 分区中对应分桶的 Tablet
通过这种多层分片机制,Doris 平衡了数据管理灵活性与查询性能需求。