【Doris基础】Apache Doris中的Segment详解:存储与查询的核心组件
目录
1 Segment概述
1.1 什么是Segment
1.2 Segment的重要性
2 Segment的物理结构
2.1 Segment文件组成
2.2 列数据存储格式
3 Segment的生命周期
3.1 Segment创建
3.2 Segment合并(Compaction)
3.3 Segment过期与清理
4 Segment与查询处理
4.1 查询中的Segment剪枝
4.2 并行查询处理
5 Segment优化策略
5.1 Segment大小优化
5.2 索引优化
5.3 数据组织优化
6 Segment监控与管理
6.1 关键监控指标
6.2 常用管理命令
7 Segment高级特性
7.1 部分更新
7.2 物化视图Segment
7.3 Segment缓存
8 总结
1 Segment概述
Apache Doris(原百度Palo)是一个现代化的MPP(大规模并行处理)分析型数据库系统,而Segment是Doris存储引擎中的核心概念之一。理解Segment对于深入掌握Doris的工作原理和性能优化至关重要。
1.1 什么是Segment
在Doris中,Segment是指表数据按照分区(Partition)和分桶(Bucket)规则划分后,每个Tablet内部进一步划分的数据单元。它是Doris中最小的物理存储单元,也是数据导入、压缩、合并(Compaction)和查询处理的基本单位。
1.2 Segment的重要性
Segment的设计直接影响着Doris的多个关键性能指标:
- 查询性能:查询时只需要扫描相关的Segment,避免全表扫描
- 导入性能:数据可以并行写入多个Segment
- 存储效率:Segment级别的压缩和编码优化存储空间
- 数据新鲜度:通过Segment实现数据的快速导入和可见
2 Segment的物理结构
2.1 Segment文件组成
每个Segment在物理存储上由多个文件组成,典型的Segment文件结构如下:

文件组成说明:Header文件:存储Segment的元信息,如版本号、行数、创建时间等数据文件:
- 列数据文件:存储实际的列数据,采用列式存储格式
- 删除条件文件:记录该Segment中被标记删除的数据
索引文件:
- 前缀索引:加速等值查询和范围查询
- ZoneMap索引:存储每个数据块的min/max值,用于快速过滤
- BloomFilter索引:用于高效判断数据是否存在
- Bitmap索引:适用于低基数列的高效过滤
2.2 列数据存储格式
Doris中的Segment采用列式存储格式,每个列的数据独立存储。列数据文件内部又分为多个数据页(Page),每个Page是压缩和编码的基本单位。

列存储优势:
- 高压缩率:同类数据压缩效果更好
- 查询高效:只需读取查询涉及的列
- 向量化执行:适合现代CPU的SIMD指令
3 Segment的生命周期
3.1 Segment创建
Segment在数据导入时创建,主要流程如下:

关键步骤说明:
- 分配Tablet和Segment:FE根据分区分桶规则确定数据应该写入哪个Tablet,并在对应的BE上创建Segment
- 创建临时Segment:BE先创建临时Segment接收数据
- 写入数据:数据按列组织,并构建各类索引
- 提交Segment:数据写入完成后,临时Segment转为正式Segment
- 元数据汇报:BE向FE汇报新增的Segment信息
3.2 Segment合并(Compaction)
随着数据不断导入,系统中会积累大量小Segment,影响查询性能。Doris通过Compaction过程合并小Segment。

合并类型:
- 基线合并(Base Compaction):合并多个Segment为一个较大的Segment
- 增量合并(Cumulative Compaction):合并最近导入的小Segment
3.3 Segment过期与清理
Segment会根据表的TTL(Time-To-Live)设置自动过期并被清理:

4 Segment与查询处理
4.1 查询中的Segment剪枝
Doris查询引擎会尽可能跳过不相关的Segment,这一过程称为Segment剪枝:

分区剪枝:利用分区条件跳过整个分区分桶剪枝:利用分桶条件跳过不相关的TabletSegment级剪枝:
- 使用ZoneMap索引跳过不包含目标数据的Segment
- 使用BloomFilter快速判断数据是否存在
4.2 并行查询处理
Doris的MPP架构可以在多个Segment上并行执行查询:

5 Segment优化策略
5.1 Segment大小优化
合理的Segment大小对性能至关重要:
- 过小Segment问题:
- 元数据膨胀
- 查询时需要打开大量文件
- Compaction压力大
- 过大Segment问题:
- 导入延迟高
- 不利于并行查询
- 故障恢复成本高
推荐配置:
- 单个Segment大小建议在100MB-1GB之间
- 通过tablet_size参数控制Tablet大小间接影响Segment大小
5.2 索引优化
索引选择策略:
- 高基数列:BloomFilter或前缀索引
- 低基数列:Bitmap索引
- 数值范围查询:ZoneMap索引
- 等值查询:前缀索引
5.3 数据组织优化
- 排序键设计:将常用过滤条件列设为排序键,提高ZoneMap索引效率
- 数据局部性:相关数据尽量组织在同一Segment
- 冷热分离:通过分区策略将热数据与冷数据分开
6 Segment监控与管理
6.1 关键监控指标

6.2 常用管理命令
- 查看Segment信息:
SHOW TABLETS FROM table_name;
- 手动触发Compaction:
ADMIN COMPACT TABLE table_name;
- 查看Segment元数据:
SHOW TABLET tablet_id;
7 Segment高级特性
7.1 部分更新
Doris支持Segment级别的部分列更新:

7.2 物化视图Segment
物化视图在Doris中也以Segment形式存储:

7.3 Segment缓存
BE会缓存热点Segment数据加速查询:

8 总结
Segment作为Doris存储引擎的核心组件,其设计直接影响系统的导入性能、查询效率和存储成本。通过合理配置Segment大小、精心设计索引策略以及有效管理Segment生命周期,可以充分发挥Doris在高性能分析场景下的优势。在实际应用中,建议根据业务特点监控Segment相关指标,定期优化表结构,并利用Doris提供的丰富工具进行性能调优,以获得最佳的系统表现。