【Doris基础】Apache Doris数据模型全面解析:选择最适合你的数据组织方式

发布于:2025-05-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

1 Doris简介与数据模型概述

2 Duplicate模型:明细数据存储

2.1 基本概念与特点

2.2 适用场景

2.3 建表示例

2.4 存储结构与查询特点

2.5 优缺点分析

3 Aggregate模型:预聚合数据分析

3.1 基本概念与特点

3.2 聚合函数与关键概念

3.3 适用场景

3.4 建表示例

3.5 数据合并过程

3.6 优缺点分析

4 Unique模型:主键唯一数据

4.1 基本概念与特点

4.2 实现原理

4.3 适用场景

4.4 建表示例

4.5 数据更新机制

4.6 优缺点分析

5 数据模型对比与选型指南

5.1 三种模型对比

5.2 选型决策流程图

5.3 应用建议

5.4 高级技巧与最佳实践

6 Doris数据模型底层原理

6.1 存储结构概述

6.2 数据组织方式

6.3 聚合模型的实现细节

6.4 更新操作的实现

7 总结


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的三种数据模型各有特点,能够满足不同场景下的数据分析需求。在实际应用中,应根据业务特点、查询模式和性能要求选择合适的数据模型,有时还需要组合使用多种模型。

网站公告

今日签到

点亮在社区的每一天
去签到