【Doris基础】Apache Doris的存储格式详解

目录

1 Doris简介

2 Doris存储格式概述

3 数据分区(Partition)详解

3.1 分区概念

3.2 分区类型

3.3 分区管理

4 分桶(Bucket)机制

4.1 分桶概念

4.2 分桶配置

4.3 分桶与并行查询

5 列式存储结构

5.1 列存优势

5.2 存储文件结构

5.3 数据文件格式

6 索引结构

6.1 前缀索引

6.2 Bloom Filter

6.3 索引使用流程

7 数据版本管理

7.1 版本概念

7.2 版本文件结构

7.3 版本合并策略

8 压缩与编码

8.1 压缩算法

8.2 编码方式

9 总结


1 Doris简介

Apache Doris(原百度Palo)是一个基于MPP架构的高性能、实时的分析型数据库,主要用于解决海量数据的实时分析问题。Doris融合了Google Mesa和Apache Impala的技术思想,具有以下显著特点:
  • 实时分析:支持实时数据导入和实时查询
  • 高并发:可支持数千QPS的高并发查询
  • 易用性:兼容MySQL协议,支持标准SQL
  • 分布式:支持水平扩展,可处理PB级数据
Doris的这些特性使其广泛应用于用户行为分析、日志分析、广告数据分析等场景。

2 Doris存储格式概述

Doris的存储格式是其高性能的核心所在,它采用了列式存储、前缀索引、物化视图等多种优化技术。Doris的存储格式主要包含以下几个关键部分:
  • 数据分区(Partition):表数据按照分区规则被水平划分
  • 分桶(Bucket):每个分区内的数据进一步哈希分桶
  • 列式存储(Column Storage):数据按列而非按行存储
  • 索引结构(Index):包括前缀索引、Bloom Filter等
  • 数据版本(Version):基于MVCC的多版本控制

3 数据分区(Partition)详解

3.1 分区概念

分区是Doris中最顶层的物理存储单元,一个表可以按照用户指定的分区规则划分为多个分区。分区的主要目的是:
  • 数据管理:方便对数据进行生命周期管理
  • 查询优化:通过分区裁剪减少扫描数据量
  • 并行计算:不同分区可以并行处理

3.2 分区类型

Doris支持两种分区方式:
  • Range分区:按照连续的区间范围划分,常用于时间维度
PARTITION BY RANGE(`dt`) (
    PARTITION p202501 VALUES LESS THAN ('2025-02-01'),
    PARTITION p202502 VALUES LESS THAN ('2025-03-01')
)
  • List分区:按照离散的值列表划分,常用于地区、类别等维度
PARTITION BY LIST(`city`) (
    PARTITION pEast VALUES IN ('Shanghai', 'Beijing'),
    PARTITION pWest VALUES IN ('Chengdu', 'Chongqing')
)

3.3 分区管理

  • Doris提供了丰富的分区管理操作:
  • 添加分区:ALTER TABLE table ADD PARTITION p1 VALUES LESS THAN('2025-04-01')
  • 删除分区:ALTER TABLE table DROP PARTITION p1
  • 临时分区:用于数据修正的特殊分区
  • 分区替换:通过临时分区实现原子替换

4 分桶(Bucket)机制

4.1 分桶概念

分桶是分区内的二次数据划分,通过哈希函数将数据均匀分布到各个桶中。分桶的主要作用:
  • 数据均衡:保证数据均匀分布在各个节点
  • 并行计算:分桶是并行计算的基本单位
  • Join优化:相同分桶规则的表可进行Colocate Join

4.2 分桶配置

  • 分桶配置示例:
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10

4.3 分桶与并行查询

5 列式存储结构

5.1 列存优势

Doris采用列式存储,相比行存具有以下优势:
  • 高压缩率:同类型数据压缩效率高
  • 查询高效:只读取需要的列
  • 向量化:支持SIMD指令优化

5.2 存储文件结构

  • 每个Tablet的存储结构如下:

5.3 数据文件格式

Doris的数据文件采用自研格式,主要包含:
  • 数据区:存储实际的列数据
  • 元数据区:存储数据类型、压缩方式等信息
  • 索引区:存储每列的索引信息

6 索引结构

6.1 前缀索引

前缀索引是Doris特有的索引结构:
  • 实现原理:对每行数据的前36字节建立稀疏索引
  • 索引定位:通过二分查找快速定位数据位置
  • 适用场景:适合点查询和高选择性查询

6.2 Bloom Filter

Doris为每个数据块创建Bloom Filter:
  • 原理:概率型数据结构,判断"元素一定不存在"或"可能存在"
  • 配置:可在建表时指定列创建Bloom Filter
PROPERTIES ("bloom_filter_columns"="user_name,email")

6.3 索引使用流程

7 数据版本管理

7.1 版本概念

Doris采用多版本并发控制(MVCC)机制:
  • 版本号:每次导入都会生成新版本
  • 版本合并:定期将小版本合并为大版本
  • 查询隔离:查询只能看到已提交的版本

7.2 版本文件结构

7.3 版本合并策略

Doris有两种合并策略:
  • 小版本合并:自动将多个小版本合并为一个较大版本
  • 全量合并:将所有版本完全合并为一个基准版本

8 压缩与编码

8.1 压缩算法

Doris支持多种压缩算法:
  • LZ4:默认算法,平衡压缩率和速度
  • ZSTD:高压缩率算法
  • SNAPPY:快速压缩算法

8.2 编码方式

针对不同数据类型采用不同编码:
  • 字典编码:低基数列
  • 位图编码:布尔类型
  • RLE:连续重复值
  • 直接编码:无法优化的列

9 总结

Doris的存储格式经过精心设计,融合了多种先进技术:
  • 分层存储:分区+分桶实现数据高效管理
  • 列式存储:提高压缩率和查询效率
  • 智能索引:前缀索引+Bloom Filter加速查询
  • 版本控制:MVCC实现并发控制
这些设计使得Doris能够同时支持高并发点查询和复杂分析查询,成为实时分析场景的理想选择。通过合理配置分区、分桶和索引策略,可以充分发挥Doris的存储性能,满足不同业务场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值