Stories

Detail Return Return

深入理解 StarRocks Bitmap 索引和 Bitmap 去重 - Stories Detail

在 StarRocks 中,Bitmap 索引和 Bitmap 去重是兩種基於位圖技術的核心功能,但它們的應用場景、實現機制以及優化目標存在顯著差異。以下從定義、作用、實現原理、適用場景及限制等方面進行詳細對比分析:

一、Bitmap 索引的作用與原理

StarRocks 中的 Bitmap 索引是一種特殊的數據庫索引,其主要作用是優化查詢性能,特別是在處理低基數列(如性別、地區等)和高基數列的過濾查詢中表現突出。

具體來説,Bitmap 索引通過將數據映射為位圖(bit array),每個 bit 對應表中的一個數據行,根據行的值決定 bit 的 0 或 1 狀態,從而實現高效的集合運算和過濾操作。

1. 核心作用

  • 查詢加速:Bitmap 索引主要用於優化低基數列的等值查詢(=)、範圍查詢(>, <等)和IS NULL查詢。
  • 多條件組合過濾:通過bitmap_and()、bitmap_or()等函數實現多列聯合查詢的高效篩選(例如用户標籤組合查詢)。
  • 減少數據掃描:通過位圖的位運算快速確定符合條件的數據頁(Page),降低 I/O 和計算開銷。

2. 實現原理

  • 字典與位圖映射:每個唯一值對應一個編碼 ID,並生成一個位圖,其中每一位表示該值是否存在於某一行。例如,性別列gender的字典可能為{'male': 1, 'female': 2},對應的位圖標記行是否存在該值。
  • 存儲優化:字典和位圖按 Page(默認 64KB)組織,索引部分常駐內存,加速查詢。
  • 自適應選擇機制:根據過濾條件涉及的列值數量與基數的比例(bitmap_max_filter_ratio參數),動態決定是否使用索引。

3. 適用場景

  • 低基數列:基數範圍建議在 10,000 至 100,000 之間,例如地區、產品類別等。
  • 多列組合查詢:例如用户畫像中同時滿足“年齡=30 歲”且“消費等級=高”的篩選。
  • 非前綴過濾:不依賴主鍵或前綴索引的場景,支持任意列的獨立查詢。

在用户畫像、實時報表、行為分析等場景中,Bitmap 索引能夠顯著提升查詢速度,例如統計男女用户數量或快速過濾特定條件的數據。物化視圖結合 Bitmap 索引,可以進一步優化複雜查詢的性能。

4. 限制

  • 數據類型限制:不支持FLOAT、DOUBLE、BOOLEAN和DECIMAL列。
  • 模型依賴:在聚合模型中僅允許為 Key 列創建索引。
  • 高基數負面影響:基數過高會導致索引存儲膨脹,影響導入性能和磁盤空間。

StarRocks 的 Bitmap 索引通過高效的數據結構設計和優化機制,在特定場景下能夠顯著提升查詢性能,尤其適用於低基數列的過濾和統計操作。不過,其適用範圍和效果需根據具體業務需求和數據特性,進行合理選擇和調整。

二、Bitmap 去重的作用與原理

1. 核心作用

  • 精確去重統計:用於計算COUNT(DISTINCT)指標(如 UV、訂單數等),替代傳統哈希或排序方法。
  • 節省存儲與計算資源:通過位壓縮減少存儲佔用,並利用位運算(如bitor)加速聚合。
  • MPP 並行優化:分佈式計算節點獨立生成子位圖,合併後生成全局去重結果。

2. 實現原理

  • 位圖置位與統計:將元素值映射到位圖下標,置位表示存在,最終統計置位數量即為去重結果。
  • Roaring Bitmap 優化:針對稀疏數據優化存儲,減少內存佔用。
  • 全局字典轉換:非整型數據(如字符串)需通過全局字典映射為整數,再構建位圖。

3. 適用場景

  • 高基數列精確統計:例如用户 ID、訂單 ID 的去重計算。
  • 實時分析:在物化視圖中預計算高頻去重指標,加速查詢。
  • 海量數據聚合:替代傳統COUNT DISTINCT,避免多次 Shuffle 操作。

4. 限制

  • 數據類型限制:原生支持TINYINT、SMALLINT、INT、BIGINT,其他類型需全局字典。
  • 全局字典構建複雜度:字典維護可能引入額外 ETL 流程(如 Flink 實時同步)。
  • 連續性影響性能:數據若連續遞增(如自增 ID),Roaring Bitmap 性能更優。

StarRocks 中的 Bitmap 去重技術通過精確、高效的方式解決了大數據場景下的去重問題,提升了查詢性能並降低了存儲成本。

三、兩者的核心區別

Bitmap 索引是“查詢加速器”,解決低基數列的篩選效率問題,Bitmap 去重是“精確計數器”,解決高基數列的聚合性能問題。兩者在底層實現和適用場景上互補,結合使用可在複雜分析場景中實現端到端優化。

1743561597519.png

1. 功能目標

  • Bitmap 索引:優化查詢過濾,減少數據掃描量,提升篩選效率。
  • Bitmap 去重:優化聚合計算,實現高效精確去重統計。

2. 技術實現

  • 索引結構:基於列值的字典和位圖映射,用於快速定位數據頁。
  • 去重機制:基於元素到位的映射,通過置位和統計操作完成聚合。

3. 適用數據類型

  • 索引適用:低基數的枚舉型列(如性別、狀態碼)。
  • 去重適用:高基數的唯一標識列(如用户 ID、訂單 ID)。

4. 存儲與性能影響

  • 索引開銷:索引佔用磁盤空間,可能影響導入性能。
  • 去重開銷:全局字典轉換和稀疏位圖存儲可能增加 ETL 複雜度。

5. 二者分別適用的業務場景

場景 1:用户畫像分析(Bitmap 索引)

  • 需求:篩選出“北京地區、性別為女性、最近 7 天有購物行為的用户”。
  • Bitmap 索引應用

    • 對city、gender、last_purchase_time三列分別創建 Bitmap 索引。
    • 通過bitmap_and()合併三個條件對應的位圖,快速得到滿足條件的用户 ID 集合。
    • 直接讀取目標位圖對應的數據頁,避免全表掃描。
  • 優勢:減少 90%的數據掃描量,查詢耗時從秒級降至毫秒級。

場景 2:實時 PV/UV 統計(Bitmap 去重)

  • 需求:計算“當日每個廣告的曝光次數(PV)和獨立用户數(UV)”。
  • Bitmap 去重應用

    • 使用BITMAP_UNION聚合函數,將用户 ID 轉換為位圖。
    • 每個計算節點生成局部位圖,通過BITMAP_UNION_COUNT合併全局位圖並統計 UV。
    • PV 直接通過COUNT(*)計算。
  • 優勢:10 億級數據下,UV 計算從分鐘級降至秒級,且結果精確。

四、總結

  • 選擇 Bitmap 索引的條件

    • 需要加速低基數列的等值或範圍查詢。
    • 多列組合查詢頻繁,且過濾條件可有效減少掃描量。
    • 可接受索引存儲和導入性能的一定損耗。
  • 選擇 Bitmap 去重的條件

    • 需要高效計算高基數列的精確去重指標。
    • 數據規模大,傳統COUNT DISTINCT性能不足。
    • 已通過全局字典解決非整型數據映射問題。

在用户行為分析中,可同時使用 Bitmap 索引加速標籤篩選(如“點擊廣告的用户”),並通過 Bitmap 去重統計唯一用户數,實現端到端的高效分析。通過合理設計索引策略與去重方案,StarRocks 的 Bitmap 技術能夠在複雜查詢和大規模數據場景中發揮關鍵作用。

user avatar xzqcsj Avatar greasql Avatar kerrywu Avatar tugraph Avatar aixiaodekaomianbao_ddkwvd Avatar
Favorites 5 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.