在現代數據處理中, 數組 (Array) 作為一種高效存儲和操作結構化數據的方式, 被廣泛應用于日志分析, 用戶行為統計, 標簽系統等場景. 然而, 不同數據庫對數組的支持差異顯著. 本文將以MySQL和StarRocks為例, 深入解析它們的數組操作能力, 并對比其適用場景.
文章目錄
- 一 為什么需要數組操作?
- 二 MySQL: 基于JSON數組的曲線救國
- 1. 創建與初始化
- 2. 修改與更新
- 3. 查詢與搜索
- 4. 性能優化技巧
- 三 StarRocks: 原生數組的高性能實踐
- 1. 原生數組的優勢
- 2. 核心操作示例
- 四 如何選擇?MySQL vs StarRocks對比
- 五 實戰建議
一 為什么需要數組操作?
數組能夠將多個相關值聚合為單個字段, 例如:
- 用戶標簽:
["科技愛好者", "程序員", "健身達人"]
- 訂單商品ID列表:
[1001, 1003, 1005]
- 時序數據:
[25.3, 24.8, 26.1]
傳統關系型數據庫 (如MySQL) 通常依賴多表關聯處理這類需求, 而現代分析型數據庫 (如StarRocks) 通過原生數組類型和豐富的函數, 大幅提升了數據操作的效率. 接下來, 我們將分別探討兩者的實現方式.
二 MySQL: 基于JSON數組的曲線救國
MySQL雖不支持原生數組類型, 但從5.7版本起引入了JSON類型, 通過JSON數組模擬數組操作, 適合輕量級場景.
1. 創建與初始化
-
JSON_ARRAY()
: 快速構造JSON數組-- 創建包含混合類型的數組 SELECT JSON_ARRAY('手機', 2999, TRUE); -- 輸出: ["手機", 2999, true]
-
JSON_ARRAYAGG()
: 聚合多行數據為數組-- 將用戶訂單的商品ID聚合為數組 SELECT user_id, JSON_ARRAYAGG(product_id) FROM orders GROUP BY user_id;
2. 修改與更新
-
JSON_INSERT()
: 在指定位置插入元素SET @cart = '["筆記本", "鋼筆"]'; SELECT JSON_INSERT(@cart, '$[2]', '橡皮'); -- 輸出: ["筆記本", "鋼筆", "橡皮"]
-
JSON_REMOVE()
: 刪除指定索引的元素SELECT JSON_REMOVE('["A", "B", "C"]', '$[1]'); -- 輸出: ["A", "C"]
3. 查詢與搜索
-
JSON_EXTRACT()
(或->
運算符) : 提取元素SELECT tags->'$[0]' FROM user_profile WHERE id = 1001; -- 提取第一個標簽
-
JSON_CONTAINS()
: 判斷是否包含特定值SELECT * FROM products WHERE JSON_CONTAINS(category_ids, '1003');
4. 性能優化技巧
-
多值索引 (Multi-Valued Indexes) : 加速JSON數組查詢
CREATE INDEX idx_tags ON users (CAST(profile->'$.tags' AS CHAR(255) ARRAY) );
-
JSON_TABLE()
: 將數組轉換為臨時表進行JOIN操作SELECT user_id, tag FROM users, JSON_TABLE(profile->'$.tags', '$[*]' COLUMNS (tag VARCHAR(50) PATH '$') ) AS tags;
三 StarRocks: 原生數組的高性能實踐
StarRocks作為分析型數據庫, 從2.5版本起支持原生數組類型 (ARRAY<T>
) , 并針對大數據場景優化了性能, 適合復雜計算.
1. 原生數組的優勢
- 存儲高效: 二進制編碼, 比JSON解析速度更快.
- 計算優化: 向量化執行引擎加速聚合, 過濾等操作.
- 類型安全: 強制元素類型一致 (如
ARRAY<INT>
) .
2. 核心操作示例
-
創建數組
-- 直接構造數組 SELECT ARRAY(1, 2, 3); -- 輸出: [1, 2, 3]-- 從字符串轉換 SELECT CAST('[2023-01-01, 2023-01-02]' AS ARRAY<DATE>);
-
動態修改
-- 追加元素 SELECT ARRAY_APPEND(scores, 95) FROM student;-- 刪除所有匹配值 SELECT ARRAY_REMOVE(ARRAY(1,2,2,3), 2); -- 輸出: [1,3]
-
高級分析
-- 計算數組統計值 SELECT ARRAY_SUM(daily_sales) FROM shop; -- 周銷量總和-- 生成累加數組 SELECT ARRAY_CUM_SUM(ARRAY(10, 20, 30)); -- 輸出: [10, 30, 60]
-
與Bitmap結合
-- 用戶興趣標簽的并集計算 SELECT BITMAP_UNION(ARRAY_TO_BITMAP(tags)) FROM user_interest;
四 如何選擇?MySQL vs StarRocks對比
場景 | 推薦方案 | 原因 |
---|---|---|
輕量級業務 (如CMS標簽) | MySQL JSON數組 | 兼容性強, 無需改造表結構, 適合已有MySQL系統的擴展. |
實時分析 (如用戶畫像) | StarRocks原生數組 | 原生類型性能更高, 支持復雜聚合 (如ARRAY_UNIQUE_AGG() ) . |
混合型數據操作 | MySQL多值索引 + JSON_TABLE() | 兼顧JSON靈活性和查詢效率. |
海量數據計算 | StarRocks數組 + 向量化引擎 | 分布式架構和列式存儲優化, 適合TB級數據分析. |
五 實戰建議
-
MySQL適用場景
- 數據結構變化頻繁 (如動態表單字段) .
- 需要兼容JSON API接口.
- 示例: 電商訂單的擴展屬性存儲.
-
StarRocks適用場景
- 固定模式的數組分析 (如時序數據, 用戶行為序列) .
- 需要高性能聚合計算 (如廣告點擊流分析) .
- 示例: 分析用戶最近30天的登錄時間分布.