聊聊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.pswp.cn/web/76432.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76432.shtml
英文地址,請注明出處:http://en.pswp.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的運行速度占有絕對優勢。 變…