聊聊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 的聚合模型,当你在分析计算过程中得到了好处,则可能在数据插入时损失一些性能。当然好的产品或者好的架构师,就是结合自身的业务需求,将适当的技术和产品放在最合理的位置,从而发挥出最大的价值!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于vue框架的点餐系统设计及实现w93q6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,菜品分类,菜品信息,配送员,订单信息,配送进度,评价记录 开题报告内容 基于 Vue 框架的点餐系统设计及实现开题报告 一、研究背景与意义 (一)研究背景 在当今快节奏的生活中,网上订餐已成为人…

LeetCode 2563.统计公平数对的数目:排序 + 二分查找

【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…

CF1016赛后总结

文章目录 前言T1:Ideal GeneratorT2:Expensive NumberT3:Simple RepetitionT4:Skibidi TableT5:Min Max MEXT6:Hackers and Neural NetworksT7:Shorten the Array 前言 由于最近在半期考试,更新稍微晚了一点,还望大家见谅 &#…

HFSS3(limy)——建模学习记录

前言——笔者使用的是21版HFSS 1.基本模型 为什么没有环形的天线 2.创建基本模型方法 常用:先粗略建好模型再编辑输入准确坐标和大小尺寸(这里长方体起始点是左上角下方的点,也就是说要输入模型起点相对于坐标原点的位置尺寸就可以确定具体…

API网关的作用?企业如何应用API网关?

一、API网关的用处 API网关我的分析中会用到以下三种场景。 1、Open API 企业需要将自身数据、能力等作为开发平台向外开放,通常会以rest的方式向外提供。最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。 Open API开放平台必然涉及到客户应用…

国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议图像数据上报通知接口介绍B.13.1 接口描述B.13.2 接口流程B.13.3 接口参数B.13.3.1 SIP头字段B.13.3.2 SIP响应码B.13.3.3 XML Schema参数定义 B.13.4 消息示例B.13.4.1 图像数据上报请求B.13.4.2 图像数据上报响应 二、B接口图像数据上报通知失败常见问…

springAi---智能客服

首先被取代的是客服类,智能客服机器人都能够高效地完成任务。 spring Ai 大模型应用相关开发demo,智能客服系统; 在需求分析阶段,把功能属于传统Java处理的和ai的功能进行分离 梳理为流程图如下: 在大模型中&#…

Java面试(2025)——基础

Java语言有哪些特点? Java语言具有多个显著特点,使其在编程领域广受欢迎。首先,Java的跨平台性非常强,通过Java虚拟机(JVM)实现“编写一次,随处运行”,使得开发者能够在不同操作系统…

Linux压缩与解压命令完全指南:tar.gz、zip等格式详解

Linux压缩与解压命令完全指南:tar.gz、zip等格式详解 在Linux系统中,文件压缩和解压是日常操作中不可或缺的一部分。本文将全面介绍Linux下常用的压缩和解压命令,包括tar.gz、tar、zip等格式的区别和使用方法,帮助你高效管理文件…

C++ STL 环形队列模拟实现

C STL 环形队列模拟实现 下面是一个使用C STL实现的环形队列&#xff08;Circular Queue&#xff09;的完整示例&#xff1a; #include <iostream> #include <vector> #include <stdexcept>template <typename T> class CircularQueue { private:std…

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生产环境单机的MQ不具有高可用,所以我们应该部署成集群模式,这里给大家部署一个双主双从异步复制的Broker集群 一、安装docker yum install -y docker systemctl enable docker --now # 单机部署参考: https://www.cnblogs.com/hsyw/p/1…

mysql的函数(第一期)

一、字符串函数​​ 处理文本数据&#xff0c;常用函数&#xff1a; ​​CONCAT(str1, str2, ...)​​ ​​作用​​&#xff1a;拼接字符串。​​示例​​&#xff1a;SELECT CONCAT(Hello, , World); → Hello World​​注意​​&#xff1a;若任一参数为 NULL&#xff0c;…

Linux下的网络管理

注意&#xff1a;本文使用的Linux系统版本为Red Hat Enterprise Linux 9 (RHEL 9)。 在RHEL9上&#xff0c;使用NM&#xff08;NetworkManager&#xff09;进行网络配置&#xff0c;ifcfg &#xff08;也称为 文件&#xff09;将不再是网络配置文件的主存储。虽然 ifcfg 样式仍…

游戏引擎学习第233天

原地归并排序地方很蒙圈 game_render_group.cpp&#xff1a;注意当前的SortEntries函数是O(n^2)&#xff0c;并引入一个提前退出的条件 其实我们不太讨论这些话题&#xff0c;因为我并没有深入研究过计算机科学&#xff0c;所以我也没有太多内容可以分享。但希望在过去几天里…

从《周游记3》演绎歌剧版《菊花台》,周杰伦婚礼曲目意大利文版惊喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的户外实境互动综艺《周游记3》第四期即将播出。本期节目中&#xff0c;“J式之旅”发起人周杰伦和林暐恒、杜国璋、陈冠霖、陈冠廷&#xff0c;将继续意大利之旅&#xff0c;从那不勒斯的百年老店到…

Linux系统编程 day6 进程间通信mmap

父子共享的信息&#xff1a;文件描述符&#xff0c;mmap建立的共享映射区&#xff08;MAP_SHARED&#xff09; mmap父子间进程通信 var的时候 &#xff1a;读时共享&#xff0c;写时复制 父进程先创建映射区&#xff0c;指定共享MAP_SHARED权限 &#xff0c; fork创建子进程…

opencv--图像处理

图像处理技术 图像处理技术是利用计算机对图像进行计算,分析和处理的技术,包括数字图像处理和计算机视觉两大领域。 对图像的处理包括滤波,缩放,分割,识别(两种信息对比)等。 链接 数字图像处理 1. 数字图像处理(Digital Image Processing) 数字图像处理主要关注图…

Spring 学习笔记之 @Transactional详解

一、数据库事务基础 数据库事务&#xff08;Transaction&#xff09;是数据库管理系统中用于确保数据一致性和完整性的一种机制。它是一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而保证数据库状态的正确性。 1.1 事务的基本概念 定…

【Openlayers】Openlayers 入门教程

Openlayers 入门教程 -系列文章列表 openlayers 入门教程&#xff08;一&#xff09;&#xff1a;openlayers简介 openlayers 入门教程&#xff08;二&#xff09;&#xff1a;Map 篇 openlayers 入门教程&#xff08;三&#xff09;&#xff1a;View 篇 openlayers 入门教程&a…

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…