Doris总结

1. 解决了什么问题?相比传统Spark、Flink有什么优势?

解决传统数据仓库、分析工具在性能方面的问题

  1. group by查询性能更好?
    不是创建表时就立即预聚合,而是创建表时定义聚合规则,数据插入/加载时进行预聚合

2. Doris是什么?

是一个MPP(Massively Parallel Processing)数据库,即大规模并行处理

  • 其他的MPP数据库:clickhouse、Greeplus

3. Doris优势?

  • doris —> 中国信创 —> Oracle 存储过程
  • 摆脱了Hadoop,自成一派,有可能将来大数据就等同于 MPP数据库了。
  • 亚秒级响应
  • 支持10PB以上的超大数据集

4. 使用场景

  • 实时看板:预定义的仪表盘界面,强调实时监控和直观展示
  • 即席查询:用户临时发起的探索性查询

5. 架构

|375

5.1 FE(FrontEnd)

  • 存储元数据
  • 接收请求,生成SQL的执行计划

    5.2 BE(BackEnd)

  • 存储真实数据
  • 执行具体的计划

    5.3 MySQL Client

  • 借助的是MySQL客户端

    5.4 Broker

  • 独立的进程,封装了文件系统接口,能让Doris读取远端存储系统的能力。HDFS、S3等

6. 常用端口号

|375

7. Doris数据类型


8. Doris的Row和Column

一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一
行数据中不同的字段。

  • 在默认数据模型中,Column分为排序列、非排序列
  • 在聚合模型中,Column分为 key列、value列

9. Partition(分区) 和 Tablet(分桶)

  • 分区:最小管理单元
  • 分桶:每个分桶为一个数据分片

10. Doris数据模型

10.1 数据模型到底是个啥?

主要为了支持高效的 OLAP(在线分析处理)场景。插入数据时能自动触发计算!!
eg:聚合模型。

10.2 数据模型主要分为 3 类

  • Aggregate
  • Uniq
  • Duplicate

10.2.1 Aggregate 聚合模型

  • 聚合模型中,字段有且仅有有key、value列
    • key:维度
    • value:指标
  • eg:bUki8d3J6puQtIKoHXiH

10.2.2 Uniq 模型

  • Uniq模型,为了保证Key的唯一性。———可以类比:定义MySQL的主键
  • 可用聚合模型中的replace实现:
    • user_id、username是key
    • 其他字段都是value,聚合方式是replace
  • eg:
    85PwEt47ZK2jKNI2G1vv

10.2.3 Duplicate 模型

  • 原来数据什么样,插入之后还是什么样,没有唯一性约束,也没有聚合需求
  • 而在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照哪些列进行排序。
  • eg:
    GDKoWt1m65b29Wk5meVS

11. 动态分区

  • 动态分区和静态分区区别
    • 静态分区:插入时,手动指定分区
    • 动态分区:根据查询结果,动态分区
  • eg:
  • 一些参数
    4OsuX634EK0xNOOklPIg

12. Rollup表

  • Rollup(“上卷”)目的:在Base表的基础上

    • Aggregate、Uniq模型:获得更粗粒度的聚合数据
    • Duplicate模型:调整列顺序,以命中前缀索引
  • Base表:通过建表语句创建的表,Base 表中保存着按用户建表语句指定的方式存储的基础数据。

  • 在 Base 表之上,我们可以创建任意多个 ROLLUP 表,对用户不可见。

  • eg:
    Aggrate模型中
    Base表保存:各个用户在3月的购买金额
    Rollup表中:各个城市在3月的购买金额

12.1 Aggregate聚合、Uniq模型中的Rollup表

  • 目的:获得更粗粒度的聚合数据
  • 建Rollup表
  • 正常查询Base表,指定(Rollup指定的) 聚合维度,指标,Explain后发现走的是Rollup

12.2 Duplicate模型中的Rollup表

  • 解释一下,Duplicate模型建的表,本身就是明细数据,需要建Rollup表干嘛?
  • 回答:
    1. 建表语句建立的Base表,默认有基于key的前缀索引
    2. 此时,如果筛选条件,不匹配前缀索引,那么查询效率很低
    3. 此时,需要根据当前的筛选条件,来作为key,建立Rollup表
      图解释(Rollup表中调换了key的位置):

13. 物化视图

13.1 物化视图是什么?

说白了,就是预先存储的查询结果。记录了操作(SQL)+结果(SQL得到的结果),和Rollup类似

13.2 物化视图 VS Rollup

  • Rollup 和 Materialized View 都会提前保存 SQL 结果(或其聚合形式),以加速后续查询。
  • Rollup不能对明细数据预聚合,Materialized View可以
  • 存储和性能开销:
    • Rollup:存储在基表同一空间,自动压缩;查询加速 10-100x,适合大明细表。
    • Materialized View:独立存储表,空间开销大;加速效果好,但刷新延迟可能影响实时性(Doris 2.1+ 优化)。
  • 灵活的粒度:
    • Rollup仅对固定粒度
    • Materialized View高度灵活

13.3 创建物化视图

1
create materialized view xxx as select * from tb;

实操各个语句

连接Doris

创建用户,创建数据库

创建表

创建基于 Aggregate 模型构建的表

创建基于 Uniq 模型构建的表

创建基于 Duplicate 模型构建的表

开启动态分区,并配置

创建基于 Aggregate、Uniq 模型的Rollup表

创建基于 Duplicate 模型的Rollup表

注意⚠️

1. 分区、分桶中

  • 分区中,注意删除某分区,可能导致该分区的数据无法导入
  • 分区支持Range、List,分桶支持Hash

2. doris为什么不建议使用insert into单条记录?

  • 性能开销高:每个 INSERT INTO 语句在 Doris 中都被视为一个完整的导入事务,会涉及:触发分布式协调、数据分发、分桶计算、校验等一系列操作,造成..

3. 聚合模型中,插入新数据的value字段是NULL,那么这个value字段的值不更新

4. 聚合模型中,由于会预聚合,导致count(*)不准确,那么如何处理?

  • 新增一列值恒为1的字段。聚合类型为SUM即可。

5. 视图和物化视图有什么区别:

  • 视图:仅记录要进行的操作(SQL),不保存结果
  • 物化视图:记录 操作+结果

6. 物化视图:每次数据有变化,都会生成一个结果


Doris总结
https://blog.zzzero.site/2025/Doris总结/
作者
ZhouZhou
发布于
2025年10月22日
许可协议