目錄
一、數據模型選擇 (核心優化)
二、分區與分桶策略 (數據分布優化)
三、字段類型與壓縮
四、索引策略
五、高級特性應用
六、建表示例(關鍵優化整合)
參考官網 優化性能 | StarRocks
在 StarRocks 中創建表時,合理的表設計是性能優化的基石。以下是從多個關鍵方向考慮的優化要點:
一、數據模型選擇 (核心優化)
- 明細模型 (Duplicate Key)
-
- 適用場景:需要保留原始明細數據(如日志、交易流水)、任意維度組合查詢或頻繁更新。
- 優化點:僅需指定排序列(非唯一),通常選擇常用過濾條件列(如
dt, user_id
)。避免過多排序列增加存儲開銷。
- 聚合模型 (Aggregate Key)
-
- 適用場景:預聚合報表(如 PV、UV、SUM、MAX)。
- 優化點:
-
-
- 精確選擇聚合列和聚合函數(
SUM
、REPLACE
、MAX
等)。 - 維度列需包含所有可能的查詢分組列。
- 值列必須是可聚合類型。
- 精確選擇聚合列和聚合函數(
-
- 主鍵模型 (Primary Key)
-
- 適用場景:實時更新/刪除(如用戶狀態、訂單狀態)。
- 優化點:
-
-
- 主鍵列選擇短且唯一的列(如
order_id
),減少內存占用。 - 啟用
enable_persistent_index
持久化索引提升穩定性。 - 合理設置
bucket_size
(默認 10W)平衡內存與導入性能。
- 主鍵列選擇短且唯一的列(如
-
二、分區與分桶策略 (數據分布優化)
- 分區 (Partitioning)
-
- 目的:剪枝(Pruning),減少掃描數據量。
- 優化點:
-
-
- 按時間列分區(如
PARTITION BY RANGE(dt)
),適合時序數據。 - 分區粒度適中:太細(如按秒)導致元數據膨脹;太粗(如按月)降低剪枝效果。
- 使用動態分區管理(
PROPERTIES
中配置自動創建/刪除)。
- 按時間列分區(如
-
- 分桶 (Bucketing)
-
- 目的:數據打散、并行計算優化。
- 優化點:
-
-
- 分桶鍵選擇高基數列(如
user_id
,device_id
),確保數據均勻分布。 - 分桶鍵應常作為 JOIN 或 GROUP BY 的 Key。
- 分桶數量:
- 分桶鍵選擇高基數列(如
-
-
-
-
- 建議 = BE 節點數 × CPU Core × 2(推薦 8-64)。
- 小表可設置較少桶數(如 8),大表適當增加。
-
-
-
-
- 避免使用
Random Distribution
(除非明確需要隨機分布)。
- 避免使用
-
三、字段類型與壓縮
- 字段類型優化
-
- 使用最小適用類型:
TINYINT
代替INT
,VARCHAR(10)
代替STRING
。 - 優先選數值類型(比字符串更快)。
- 避免過長的
VARCHAR
(影響內存和 IO)。
- 使用最小適用類型:
- 壓縮算法
-
- 默認
LZ4
已足夠高效,通常無需修改。 - 極高壓縮比場景可測試
Zstandard
(zstd
),但消耗更多 CPU。
- 默認
四、索引策略
- 前綴索引 (Prefix Index)
-
- 自動生成:基于排序列的前 36 字節。
- 優化點:將高頻過濾的短字段(如
user_id
)放在排序列最前面。
- Bloom Filter 索引
-
- 適用場景:高基數列的等值查詢(如
user_id
,order_id
)。 - 優化點:在
PROPERTIES
中添加bloom_filter_columns = "col1,col2"
。
- 適用場景:高基數列的等值查詢(如
- Bitmap 索引
-
- 適用場景:低基數列的等值/IN 查詢(如
gender
,city
)。 - 創建語法:
INDEX idx_name (col) USING BITMAP
- 適用場景:低基數列的等值/IN 查詢(如
五、高級特性應用
- 物化視圖 (Materialized View)
-
- 適用場景:加速固定維度的聚合查詢。
- 優化點:針對高頻復雜查詢創建異步更新的物化視圖。
- Colocate Join
-
- 適用場景:頻繁大表 JOIN。
- 優化點:
-
-
- 相關表使用相同的分桶鍵和分桶數。
- 創建時指定
colocate_with = "group_name"
。
-
- 冷熱數據分離
-
- 通過
PROPERTIES
指定 SSD/HDD 存儲策略:
- 通過
PROPERTIES ("storage_medium" = "SSD","storage_cooldown_time" = "2025-01-01 00:00:00"
);
六、建表示例(關鍵優化整合)
CREATE TABLE user_orders (dt DATE NOT NULL,user_id INT NOT NULL,order_id BIGINT NOT NULL,amount DECIMAL(10,2) REPLACE DEFAULT "0" -- 聚合模型示例
)
ENGINE=OLAP
PRIMARY KEY (dt, user_id, order_id) -- 主鍵模型
PARTITION BY RANGE(dt) (START ("2023-01-01") END ("2024-01-01") EVERY (INTERVAL 1 MONTH)
)
DISTRIBUTED BY HASH(user_id) BUCKETS 32 -- 分桶鍵選擇
PROPERTIES ("replication_num" = "3", "bloom_filter_columns" = "order_id,user_id", -- Bloom Filter"enable_persistent_index" = "true", -- 主鍵持久化"storage_medium" = "SSD" -- 熱數據存SSD
);