当前位置: 首页 > news >正文

聊聊Doris的数据模型,如何用结构化设计解决实时分析难题

传统 OLAP 系统的局限

在大数据实时分析领域,数据模型设计直接决定了系统的查询性能、存储效率与业务适配性。Apache Doris作为新一代MPP分析型数据库,通过独创的多模型融合架构,在业内率先实现了"一份数据支持多种分析范式"的能力。本文将深入解析Doris的三大核心数据模型及其背后的设计哲学。

在 Doris 出现之前,传统的 OLAP 系统通常面临以下的局限性:

  • 预聚合模型,牺牲灵活性换取性能,无法支持明细查询;
  • 全量明细模型,保留原始数据但查询效率低下;
  • Lambda 混合架构,又会导致架构复杂,而且会有数据一致性风险。

Doris 数据模型技术实现

Doris 通过数据模型来定义数据存储和管理方式,当前提供了明细模型、聚合模型以及主键模型三种表模型,不同的模型具有相应的数据去重、聚合和更新机制,满足不同应用场景需求。

明细模型 (Duplicate Key Model)

明细模型下的数据存储类似于传统数据库,允许指定的 Key 列重复,一般数据只进行追加,现有数据不更新或少量更新。 Doris 存储层保留所有写入的数据,既不去重也不聚合。

虽然无法利用预聚合特性,但是不受聚合模型的约束,可以发挥列存模型的优势。适合任意维度的 Ad-hoc 查询,典型的应用场景如日志存储、交易数据和用户行为数据查询等。

主键模型 (Unique Key Model)

每行 Key 值唯一,确保给定的 Key 列不会存在重复行,基于主键进行 UPSERT 更新,Doris 存储层对每个 Key 只保留最新写入的数据。

Doris 中的主键模型有两种实现方式:

  • 写时合并:数据在写入时立即合并相同 Key 的记录,确保存储的始终是最新数据。写时合并兼顾查询和写入性能,避免多个版本的数据合并,并支持谓词下推到存储层。大多数场景推荐使用此模式;
  • 读时合并:数据在写入时并不进行合并,以增量的方式被追加存储,在 Doris 内保留多个版本。查询或 Compaction 时,会对数据进行相同 Key 的版本合并。读时合并适合写多读少的场景,在查询是需要进行多个版本合并,谓词无法下推,可能会影响到查询速度。

主键模型默认为整行更新,即使用户使用 Insert Into 指定部分列进行写入,Doris 也会在 Planner 中将未提供的列使用 NULL 值或者默认值进行填充。如果希望更新部分字段,需要使用写时合并实现,并通过特定的参数来开启部分列更新的支持。

针对需要唯一主键约束的场景,可以保证主键唯一性约束,但无法利用 ROLLUP 等预聚合带来的查询优势。适用于需要数据更新的情况,典型的场景如用户画像和实时风控等。

聚合模型 (Aggregate Key Model)

聚合模型专为高效处理大规模数据查询中的聚合操作设计,根据 Key 列聚合数据,在数据写入时自动维护 SUM/MAX/MIN 等聚合状态, Doris 存储层保留聚合后的数据,从而减少存储空间,极大的降低聚合查询时所需要扫描的数据量和查询计算量,非常适合有固定模式的报表类查询和指标看板等场景。

当然聚合模型的使用也存在一定的局限性:

  • 模型对外展现的是最终聚合后的数据,任何还未聚合的数据(比如说两个不同导入批次的数据),必须通过某种方式,以保证对外展示的一致性。因此,在进行其他类型的聚合查询时,需要考虑语意正确性;
  • 模型对 count(*) 查询很不友好,为了得到正确的结果,必须扫描所有的聚合列,并进行聚合后才能得到语意正确的结果,查询成本非常高。

模型特征总结
模型类型数据特征典型场景性能优势
明细模型原始数据、高基数维度日志分析、Ad-hoc查询灵活查询
聚合模型固定维度、数值型指标日报表、监控看板查询速度提升100倍
主键模型频繁更新、点查为主用户画像、实时库存支持高并发点查

写在最后

实时分析场景是 Doris 的立足之本,致力于打造速度最快且最具成本效益的分析型数据库,而数据模型是实现这一目标的基础。传统 OLTP 数据库大多数使用明细模对数据进行直接的存储,而不做额外的处理和加工,好处是插入性能好,满足高响应低延时的业务系统需求;而 OLAP 类的业务通常有较多的分析计算,通过聚合模型将数据按需求提前进行计算,在查询时直接提取计算后的结果,因而大大降低了分析计算的时间,但是又会损失一些插入的时间。

数据库的设计中总是充满了各种权衡,就像 Doris 的聚合模型,当你在分析计算过程中得到了好处,则可能在数据插入时损失一些性能。当然好的产品或者好的架构师,就是结合自身的业务需求,将适当的技术和产品放在最合理的位置,从而发挥出最大的价值!

相关文章:

  • 【笔记】网路安全管理-实操
  • element-plus样式失效的原因总结
  • 机器学习(1)— 开发环境安装
  • 每天学一个 Linux 命令(25):more
  • n8n 中文系列教程_02. 自动化平台深度解析:核心优势与场景适配指南
  • Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班
  • OzGIS:地理信息分析与处理软件
  • OpenFeign终极指南:超时控制、重试策略、拦截器与自定义Starter
  • VBA 调用 dll 优化执行效率
  • Linux字符设备驱动
  • Linux下 文件的查找、复制、移动和解压缩
  • Linux压缩与解压命令完全指南:tar.gz、zip等格式详解
  • 使用EXCEL绘制平滑曲线
  • 【开发心得】Dify部署ollama模型的坑[8]
  • 【后端】【python】Python 爬虫常用的框架解析
  • Python字典深度解析:高效键值对数据管理指南
  • 在统信UOS1060中将MP3MP4格式转换为Ogg Vorbis格式
  • 基于autoware.1.14与gazebo联合仿真进行Hybrid A* 算法规划控制代价地图版
  • websocket和SSE学习记录
  • 使用Spring Validation实现参数校验
  • 美政府公布1968年罗伯特·肯尼迪遇刺事件档案
  • 刘国梁:奥运会乒乓球项目增至六金,国乒机遇与挑战并存
  • 为护航企业“出海”,“无问西东·中外商会”海上沙龙举行
  • 外交部回应美新任驻日大使涉华言论:外交官的职责不应是抹黑别国、煽动对抗
  • 释新闻|特朗普喊话鲍威尔早点走人,美国总统能否解雇美联储主席?
  • 近千人认购!上海一新盘认购数创今年新高,3月份7个项目开盘“日光”