目录
1 Doris简介与数据模型概述
数据模型是数据库系统中数据组织和存储的方式,它直接影响到数据的查询效率、存储空间和写入性能。Doris作为分析型数据库,其数据模型设计主要面向OLAP(在线分析处理)场景,强调高效的聚合查询和大规模数据分析能力。
在Doris中,数据模型的选择是表设计过程中最关键的一步,合适的数据模型能够:
- 显著提升查询效率
- 降低存储成本
- 优化数据更新和删除操作
- 提高数据加载速度
Doris主要支持三种数据模型:
- Duplicate模型、
- Aggregate模型
- Unique模型
2 Duplicate模型:明细数据存储
2.1 基本概念与特点
Duplicate模型,顾名思义,是允许数据重复的模型了,在这种模型下,Doris不会对导入的数据进行任何形式的去重或聚合处理,而是完整保留原始数据的所有细节。

2.2 适用场景
Duplicate模型最适合以下场景:
- 需要存储原始明细数据:如用户行为日志、设备传感器数据等
- 查询模式不确定:需要按不同维度灵活查询的场景
- 数据无需聚合:需要查看每条原始记录的场合
- 高吞吐写入:需要快速写入大量数据的场景
2.3 建表示例
CREATE TABLE IF NOT EXISTS user_behavior_duplicate
(
`user_id` LARGEINT NOT NULL COMMENT "用户ID",
`item_id` LARGEINT NOT NULL COMMENT "商品ID",
`behavior_type` VARCHAR(32) NOT NULL COMMENT "行为类型",
`session_id` VARCHAR(64) NOT NULL COMMENT "会话ID",
`timestamp` DATETIME NOT NULL COMMENT "行为时间",
`device_type` VARCHAR(32) NOT NULL COMMENT "设备类型",
`province` VARCHAR(32) COMMENT "省份"
)
DUPLICATE KEY(user_id, item_id, behavior_type)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES (
"replication_num" = "3"
);
2.4 存储结构与查询特点
在Duplicate模型下,数据按照DUPLICATE KEY指定的列进行排序存储,但这些键并不用于去重,仅为提高查询效率。查询时:
- 可以高效地进行范围查询
- 支持任意列的组合查询
- 没有预聚合,每次查询都扫描原始数据
- 存储空间消耗较大
2.5 优缺点分析
优点:
- 保留完整原始数据,支持灵活分析
- 写入速度快,没有聚合计算开销
- 支持任意列的查询和过滤
- 实现简单,没有复杂的合并逻辑
缺点:
- 存储成本较高
- 对于聚合查询性能较差
- 不支持基于主键的更新操作
3 Aggregate模型:预聚合数据分析
3.1 基本概念与特点
Aggregate模型是Doris中最具特色的数据模型,它通过在数据加载时进行预聚合,显著提高聚合查询的性能,这种模型适合有大量聚合分析需求的场景。

3.2 聚合函数与关键概念
Doris支持多种聚合函数,常用的包括:
- SUM:求和
- REPLACE:替换(保留最后一次值)
- MAX:取最大值
- MIN:取最小值
- REPLACE_IF_NOT_NULL:非空时替换
- HLL_UNION:基数估算
- BITMAP_UNION:位图计算
关键概念:
- 维度列:用于分组和过滤的列,在AGGREGATE KEY中指定
- 指标列:需要被聚合计算的列,使用聚合函数定义
3.3 适用场景
Aggregate模型特别适合以下场景:
- 统计报表:如PV、UV、销售额等汇总数据
- 指标监控:需要实时计算的各种业务指标
- 减少数据量:原始数据量大但查询只需要汇总结果
- 固定维度分析:按已知维度进行预计算
3.4 建表示例
CREATE TABLE IF NOT EXISTS sales_aggregate
(
`date` DATE NOT NULL COMMENT "日期",
`product_id` LARGEINT NOT NULL COMMENT "商品ID",
`customer_id` LARGEINT NOT NULL COMMENT "客户ID",
`city` VARCHAR(32) COMMENT "城市",
`sales_amount` BIGINT SUM COMMENT "销售额",
`sales_count` BIGINT SUM COMMENT "销售数量",
`last_order_time` DATETIME REPLACE COMMENT "最后下单时间",
`max_unit_price` BIGINT MAX COMMENT "最高单价"
)
AGGREGATE KEY(date, product_id, customer_id, city)
DISTRIBUTED BY HASH(product_id) BUCKETS 8
PROPERTIES (
"replication_num" = "3"
);
3.5 数据合并过程
当新数据导入时,Doris会:
- 按照AGGREGATE KEY分组
- 对每组数据应用指定的聚合函数
- 合并新数据与已有数据
- 存储合并后的结果
3.6 优缺点分析
优点:
- 聚合查询性能极佳
- 显著减少存储空间
- 降低I/O操作
- 支持实时数据更新
缺点:
- 无法获取原始明细数据
- 非聚合列查询性能较差
- 写入时需要额外聚合计算
- 维度变化时需要重新设计表结构
4 Unique模型:主键唯一数据
4.1 基本概念与特点
Unique模型确保主键唯一性,相同主键的数据会自动进行覆盖(类似于UPSERT操作),这种模型适合需要保证数据唯一性且有更新需求的场景。

4.2 实现原理
Unique模型实际上是Aggregate模型的一个特例,它使用REPLACE聚合函数实现主键唯一性,在底层实现上:
- 数据按UNIQUE KEY排序存储
- 相同主键的数据会被合并
- 非主键列使用REPLACE聚合函数
4.3 适用场景
Unique模型适合以下场景:
- 需要去重的数据:如用户资料表、商品信息表
- 有数据更新需求:如订单状态变更、用户信息更新
- KV查询:通过主键快速查找完整记录
- CDC(变更数据捕获):同步数据库变更
4.4 建表示例
CREATE TABLE IF NOT EXISTS users_unique
(
`user_id` LARGEINT NOT NULL COMMENT "用户ID",
`username` VARCHAR(50) NOT NULL COMMENT "用户名",
`email` VARCHAR(100) COMMENT "邮箱",
`phone` VARCHAR(20) COMMENT "电话",
`registration_date` DATETIME COMMENT "注册时间",
`last_login` DATETIME COMMENT "最后登录时间",
`account_status` VARCHAR(20) COMMENT "账户状态"
)
UNIQUE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES (
"replication_num" = "3",
"enable_persistent_index" = "true"
);
4.5 数据更新机制
Unique模型支持两种更新方式:
- Merge-on-Write:在写入时合并数据,写入性能稍低但查询性能高
- Merge-on-Read:在读取时合并数据,写入性能高但查询性能稍低
4.6 优缺点分析
优点:
- 保证主键唯一性
- 支持高效的点查询
- 支持数据更新
- 存储空间较Duplicate模型小
缺点:
- 写入性能低于Duplicate模型
- 频繁更新可能影响查询性能
- 不适合大规模批量导入
5 数据模型对比与选型指南
5.1 三种模型对比
特性 |
Duplicate模型 |
Aggregate模型 |
Unique模型 |
数据去重 |
否 |
按聚合键 |
按主键 |
存储空间 |
大 |
小 |
中等 |
写入速度 |
快 |
中等 |
中等/慢 |
聚合查询性能 |
差 |
极佳 |
中等 |
明细查询 |
支持 |
不支持 |
支持 |
数据更新 |
不支持 |
部分支持 |
支持 |
典型场景 |
日志分析 |
统计报表 |
业务数据 |
5.2 选型决策流程图

5.3 应用建议
日志类数据:选择Duplicate模型
- 用户行为日志
- 设备传感器数据
- 应用性能监控数据
指标类数据:选择Aggregate模型
- 网站访问统计
- 销售报表
- 运营指标监控
业务实体数据:选择Unique模型
- 用户资料
- 商品信息
- 订单主数据
5.4 高级技巧与最佳实践
混合使用模型:在复杂系统中,可以同时使用多种模型
- 用Duplicate存储原始数据
- 用Aggregate存储汇总数据
- 用Unique存储维度数据
分区与分桶优化:无论哪种模型,都要合理设计分区和分桶策略
- 按时间分区
- 按查询频率高的列分桶
索引优化:
- 对高频过滤条件创建索引
- 使用物化视图预计算复杂查询
数据生命周期管理:
- 设置TTL自动过期数据
- 冷热数据分层存储
6 Doris数据模型底层原理
6.1 存储结构概述
Doris采用列式存储结构,数据按列组织并压缩存储,每种数据模型在底层都使用相同的存储格式,但处理逻辑不同。

6.2 数据组织方式
- 表(Table):最高层级的逻辑概念
- 分区(Partition):按分区键划分,便于管理
- 分片(Tablet):数据分片,分布式并行处理单元
- 段(Segment):存储引擎中的物理文件单元
- 列(Column):列式存储的基本单位
- 页(Page):I/O操作的最小单元,通常为1MB
6.3 聚合模型的实现细节
Aggregate模型的核心是"合并聚合"(Merge-Aggregate)过程:
- 数据导入阶段:在内存中进行初步聚合
- 数据合并阶段:后台定期合并小文件
- 查询阶段:可能需要进行最终聚合
6.4 更新操作的实现
Unique模型的更新操作通过"标记-删除"+"插入"的方式实现:
- 新数据写入时标记旧数据为删除
- 插入新版本数据
- 查询时自动过滤被标记删除的数据
- 后台定期物理清理已删除数据
7 总结
Doris的三种数据模型各有特点,能够满足不同场景下的数据分析需求。在实际应用中,应根据业务特点、查询模式和性能要求选择合适的数据模型,有时还需要组合使用多种模型。