注:本篇文章闡述的是StarRocks-3.2版本的表設計相關內容。
? ? 建表是使用StarRocks非常重要的一環,規范化的表設計在某些場景下能使查詢性能有數倍的提升。StarRocks的表設計涉及到的知識點主要包括數據表類型、數據分布(分區分桶及排序鍵)、索引以及視圖、物化視圖等。
一、數據表類型
? ? StarRocks-3.2版本提供四種類型的表(數據模型),包括明細表、主鍵表、聚合表和更新表,適用于存儲多種業務數據,例如原始數據、實時頻繁更新的數據和聚合數據。
1.1 Duplicate Key Model
? 明細模型是StarRocks中最常用的數據模型,適用于既沒有聚合需求,又沒有主鍵唯一性約束的原始數據的存儲。在該模型下,即便導入兩條完全相同的數據,StarRocks也會將數據原封不動的保存進表。
1.2 Aggregate Key Model
?? ?聚合模型會在數據導入時將維度列相同的數據,根據指標列設定的聚合函數進行聚合,最終表格中只會保留聚合后的數據。
1.3 Unique Key Model
?? ?更新模型的特點是只保留相同主鍵下最新導入的數據。在更新模型中,排序鍵構成表的唯一性約束,成為我們常說的“主鍵”。(明細模型會將所有寫入的數據保留,聚合模型是對寫入的數據進行聚合處理)
1.4 Primary Key Model
? ? 主鍵模型建表時支持定義主鍵和指標列,查詢時返回主鍵相同的一組數據中的最新數據。主鍵模型和更新模型的區別在于:更新模型的實現方式是讀時合并(merge on read),簡稱Mor 。Primary 模型實現方式是寫時合并(merge on write),簡稱Mow。聚合模型和更新模型都不支持update功能,主鍵模型通過Delete+Insert 的策略,實現update功能
? ?ps:數據表(數據模型)的詳細內容見文章:?
第2.2章 StarRocks表設計——排序鍵和數據模型-CSDN博客文章瀏覽閱讀1.3k次,點贊28次,收藏24次。2.2 StarRocks表設計——排序鍵和數據模型https://blog.csdn.net/SHWAITME/article/details/136136900?spm=1001.2014.3001.5501
二、數據分布
? ? StarRocks 采用分區+分桶的兩級數據分布策略,將數據均勻分布各個 BE 節點。查詢時能夠有效裁剪數據掃描量,最大限度地利用集群的并發性能,從而提升查詢性能。
2.1 分區
? ? 邏輯概念,表中數據可以根據分區列(通常是時間和日期)分成一個個更小的數據管理單元。查詢時,通過分區裁剪,可以減少掃描的數據量,顯著優化查詢性能。
2.2 分桶
? ?物理概念,同一個分區中的數據通過分桶,劃分成更小的數據管理單元。并且分桶以多副本形式(默認為3)均勻分布在 BE 節點上,保證數據的高可用。
? 一個分區按分桶方式被分成了多個桶 bucket,每個桶的數據稱之為一個Tablet。StarRocks一般采用Hash算法作為分桶算法,即在同一分區內,分桶鍵哈希值相同的數據會劃分到同一個Tablet(數據分片),Tablet 以多副本冗余的形式存儲,是數據均衡和恢復的最?單位,數據導入和查詢最終都下沉到所涉及的 Tablet 副本上。ps:建表時,如果使用哈希分桶,則必須指定分桶鍵。
? ?ps:分區分桶及副本的詳細內容見文章(文章是StarRocks-2.5.4):?
第2.4章 StarRocks表設計——分區分桶與副本數_starrocks分區管理-CSDN博客文章瀏覽閱讀1.1k次,點贊31次,收藏22次。2.4 StarRocks表設計——分區分桶與副本數_starrocks分區管理https://blog.csdn.net/SHWAITME/article/details/136140126
?
三、數據類型
? ? ? 除了基本的數據類型,如數值、日期和字符串類型,StarRocks 還支持復雜的半結構化數據類型,包括 ARRAY、JSON、MAP、STRUCT。官網文章地址:
數據類型概述 | StarRocksStarRocks 支持以下數據類型:數值類型、字符串類型、日期類型、半結構化類型、其他類型。您在建表時可以指定以下類型的列,向表中導入該類型的數據并查詢數據。https://docs.starrocks.io/zh/docs/sql-reference/sql-statements/data-types/data-type-list/
四、存儲設計
4.1?列式存儲
? ?在StarRocks中,一張表的列可以分為維度列(也稱為 Key 列)和指標列(也稱為 Value 列)。維度列用于分組和排序,指標列的值可以通過聚合函數sum,count,min,max,bitmap_union等累加起來。
? ?在StarRocks中,表數據按列存儲。物理上,一列數據會經過分塊編碼(data page,默認是64kb)、壓縮等操作,然后持久化存儲到非易失設備上。但在邏輯上,一列數據可以看成是由相同類型的元素構成的一個數組。 一行數據的所有列值在各自的數組中按照列順序排列,即擁有相同的數組下標。表中所有的行按照維度列,做多重排序,排序后的位置就是該行的行號。
4.2?索引
? ?索引是一種特殊的數據結構,相當于數據的目錄。查詢條件命中索引列時,StarRocks 能夠快速定位到滿足條件的數據的位置。
? ? StarRocks 提供內置索引,包括前綴索引、Ordinal 索引和 ZoneMap 索引。也支持用戶手動創建索引,以提高查詢效率,包括 Bitmap 和 Bloom Filter 索引。
?4.2.1?前綴索引
? ? 由于StarRocks 底層數據是按照排序鍵排序后存儲的,而前綴索引,是在key (duplicate key、aggregate key、unique key、primary key)排序的基礎上,實現的一種根據給定一定數量(不超過3列,不超過36個字節,遇到字符串會自動截斷)前綴列,每間隔一定行數(1024),生成的一個索引項 (稀疏索引)。當查詢的過濾條件命中前綴索引時,就能快速定位到數據存儲所在的比較精確地址。
?4.2.2?Ordinal 索引
? ?Ordinal lndex索引提供了通過行號來查找Column Data Page數據頁的物理地址,Ordinal lndex索引能夠將按照列存儲的數據按行對齊,可以理解為一級索引。因此,其他類型的索引在查找數據的時候,都要借助Ordinal lndex(一級索引)查找 Data Page數據頁物理地址。
? ? 在一個segment文件中,數據始終按照key排序存儲,數據寫入的過程中,每一列的data page會由Ordinal Index管理,他會記錄每一列對應的data page的offset,size大小,和該data page的第一個數據的行號信息。這樣在查詢的時候,就能通過 Ordinal lndex索引夠快速定位到對應的data page的物理地址。
?4.2.3?ZoneMap 索引
? ?StarRocks 會為Segment文件中的一列數據(key 列)自動添加ZoneMap索引,注意:當表的模型為dupulcate時,會所有字段開啟zonemap索引。
? ?ZoneMap索引存儲了Segment和每個列對應每個Page的統計信息。Doris可以根據這些統計信息,快速判斷這些數據塊是否可以過濾掉,從而減少掃描數據量,提升查詢速度。統計信息包括了Min最大值、Max最小值、HashNull空值、HasNotNull不全為空的信息。
?4.2.4?BitMap 索引
? ? StarRocks 支持對低基數列創建Bitmap位圖索引來加速數據查詢。高基數列:例如UserID,低基數列:例如性別,婚姻狀態等。
? ? ?Bitmap位圖索引創建時需要通過 ?create index 進行創建。Bitmap的索引是整個Segment中的Column字段的索引,而不是為每個Page單獨生成一份。在寫入數據時,會維護一個map結構,去記錄下每個key值對應的行號,并采用Roaring位圖對rowid進行編碼。生成索引數據時,首先寫入字典數據,即將map結構的key值寫入到DictColumn中。然后,key對應Roaring編碼的rowid(value值)以字節方式將數據寫入到BitMapColumn。 ??
?4.2.5 BloomFilter 索引
? ?StarRocks 支持用戶對適用于高基數列(取值區分度比較大的字段)添加Bloom Filter(布隆過濾器)索引,Bloom filter索引主要用于快速判斷某列中是否存在某個值。BloomFilter判定該列中不存在指定的值,如果確定不存在,就不會讀取這個數據文件;如果索引判定該列中存在指定的值,也有可能這個值實際上不會存在,這時,會讀取數據文件來進一步確認。
? ps:高基數列:例如UserID,低基數列:例如性別,婚姻狀態等。
?ps:這幾類索引的詳細內容見文章:
Doris存儲層設計介紹1——存儲結構設計解析(索引底層結構)-CSDN博客文章瀏覽閱讀1.1k次,點贊33次,收藏19次。Doris存儲層設計介紹1——存儲結構設計解析(索引底層結構)https://blog.csdn.net/SHWAITME/article/details/136155008?spm=1001.2014.3001.5501
五、物化視圖
?該補充
參考文章:
表概覽 | StarRocks
理解 StarRocks 表設計 | StarRocks
理解 StarRocks 表設計 | StarRocks
第2.1章:StarRocks表設計--概述_starrocks array-CSDN博客