數據庫中的數組: MySQL與StarRocks的數組操作解析

在現代數據處理中, 數組 (Array) 作為一種高效存儲和操作結構化數據的方式, 被廣泛應用于日志分析, 用戶行為統計, 標簽系統等場景. 然而, 不同數據庫對數組的支持差異顯著. 本文將以MySQLStarRocks為例, 深入解析它們的數組操作能力, 并對比其適用場景.

文章目錄

    • 一 為什么需要數組操作?
    • 二 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級數據分析.

五 實戰建議

  1. MySQL適用場景

    • 數據結構變化頻繁 (如動態表單字段) .
    • 需要兼容JSON API接口.
    • 示例: 電商訂單的擴展屬性存儲.
  2. StarRocks適用場景

    • 固定模式的數組分析 (如時序數據, 用戶行為序列) .
    • 需要高性能聚合計算 (如廣告點擊流分析) .
    • 示例: 分析用戶最近30天的登錄時間分布.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode零錢兌換(動態規劃)

題目描述 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1 。 你可以認為每種硬幣的數量是無…

/sys/fs/cgroup/memory/memory.stat 關鍵指標說明

目錄 1. **total_rss**2. **total_inactive_file**3. **total_active_file**4. **shmem**5. **其他相關指標**總結 以下是/sys/fs/cgroup/memory/memory.stat文件中一些關鍵指標的詳細介紹&#xff0c;特別是與PostgreSQL相關的指標&#xff1a; 1. total_rss 定義&#xff1…

C++第14屆藍橋杯b組學習筆記

1. 日期統計 小藍現在有一個長度為 100100 的數組&#xff0c;數組中的每個元素的值都在 00 到 99 的范圍之內。數組中的元素從左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…

[Effective C++]條款28:避免返回handles指向對象內部成分

. 在C中&#xff0c;返回指向對象內部成分的引用&#xff08;handles&#xff09;可能會導致封裝性降低和對象空懸問題。為了避免這些問題&#xff0c;可以通過返回const引用來限制對內部數據的修改&#xff0c;從而確保只讀訪問 1、返回內部引用對象 下面代碼中getData函數返…

PyTorch 學習筆記

環境&#xff1a;python3.8 PyTorch2.4.1cpu PyCharm 參考鏈接&#xff1a; 快速入門 — PyTorch 教程 2.6.0cu124 文檔 PyTorch 文檔 — PyTorch 2.4 文檔 快速入門 導入庫 import torch from torch import nn from torch.utils.data import DataLoader from torchvision …

windows開啟wsl與輕量級虛擬機管理

基于win 10 打造K8S應用開發環境&#xff08;wsl & kind&#xff09; 一、wsl子系統安裝 1.1 確認windows系統版本 cmd/powershell 或者win r 運行winver 操作系統要> 19044 1.2 開啟wsl功能 控制面板 -> 程序 -> 啟用或關閉Windows功能 開啟適用于Linux的…

C++ -異常之除以 0 問題(整數除以 0 編譯時檢測、整數除以 0 運行時檢測、浮點數除以 0 編譯時檢測、浮點數除以 0 運行時檢測)

一、整數除以 0&#xff08;編譯時檢測&#xff09; 1、演示 #include <iostream>using namespace std;int main() {int result 10 / 0;cout << result << endl;return 0; }程序無法運行&#xff0c;輸出結果 error C2124: 被零除或對零求模2、演示解讀 …

【藍橋杯】搜索算法:剪枝技巧+記憶化搜索

1. 可行性剪枝應用 1.1. 題目 題目描述: 給定一個正整數n和一個正整數目標值target,以及一個由不同正整數組成的數組nums。要求從nums中選出若干個數,每個數可以被選多次,使得這些數的和恰好等于target。問有多少種不同的組合方式? 輸入: 第一行:n和target,表示數組…

Uniapp 集成極光推送(JPush)完整指南

文章目錄 前言一、準備工作1. 注冊極光開發者賬號2. 創建應用3. Uniapp項目準備 二、集成極光推送插件方法一&#xff1a;使用UniPush&#xff08;推薦&#xff09;方法二&#xff1a;手動集成極光推送SDK 三、配置原生平臺參數四、核心功能實現1. 獲取RegistrationID2. 設置別…

Linux中進程

一、認識進程 進程(PCB)內核數據結構(task_struct)程序的代碼和數據 每一個進程都有其獨立的task_struct,OS對眾多的task_struct進行管理&#xff0c;如何管理&#xff1f;先描述再組織&#xff0c;所有運?在系統?的進程都以task_struct鏈表的形式存在內核?&#xff0c;而…

國外的AI工具

一 OpenAI &#xff1a; &#x1f4a1; 總覽&#xff1a; 名稱全稱/代號簡介GPT-4o“o” omniOpenAI 最新的旗艦多模態模型&#xff08;文字、圖像、音頻三模態&#xff09;&#xff0c;比 GPT-4 更強、更快、更便宜。GPT-4o-mini精簡版 GPT-4o輕量級版本&#xff0c;推測為性…

企業級Java開發工具MyEclipse v2025.1——支持AI編碼輔助

MyEclipse一次性提供了巨量的Eclipse插件庫&#xff0c;無需學習任何新的開發語言和工具&#xff0c;便可在一體化的IDE下進行Java EE、Web和PhoneGap移動應用的開發&#xff1b;強大的智能代碼補齊功能&#xff0c;讓企業開發化繁為簡。 立即獲取MyEclipse v2025.1正式版 具…

按鍵長按代碼

這些代碼都存放在定時器中斷中。中斷為100ms中斷一次。 數據判斷&#xff0c;看的懂就看吧

在 macOS 上連接 PostgreSQL 數據庫(pgAdmin、DBeaver)

在 macOS 上連接 PostgreSQL 數據庫 pgAdmin 官方提供的圖形化管理工具&#xff0c;支持 macOS。 下載地址&#xff1a;https://www.pgadmin.org/ pgAdmin 4 是對 pgAdmin 的完全重寫&#xff0c;使用 Python、ReactJs 和 Javascript 構建。一個用 Electron 編寫的桌面運行時…

FTP協議和win server2022安裝ftp

FTP協議簡介 FTP&#xff08;File Transfer Protocol&#xff0c;文件傳輸協議&#xff09;是一種用于在網絡上的計算機之間傳輸文件的標準網絡協議。它被廣泛應用于服務器與客戶端之間的文件上傳、下載以及管理操作。FTP支持多種文件類型和結構&#xff0c;并提供了相對簡單的…

人工智能——AdaBoost算法

目錄 摘要 13 AdaBoost算法 13.1 本章工作任務 13.2 本章技能目標 13.3 本章簡介 13.4 編程實戰 13.5 本章總結 13.6 本章作業 本章已完結! 摘要 本章實現的工作是:首先采用Python語言讀取數據并構造訓練集和測試集。然后建立AdaBoost模型,利用訓練集訓練該模型,…

DFS 藍橋杯

最大數字 問題描述 給定一個正整數 NN 。你可以對 NN 的任意一位數字執行任意次以下 2 種操 作&#xff1a; 將該位數字加 1 。如果該位數字已經是 9 , 加 1 之后變成 0 。 將該位數字減 1 。如果該位數字已經是 0 , 減 1 之后變成 9 。 你現在總共可以執行 1 號操作不超過 A…

【開發經驗】調試OpenBMC Redfish EventService功能

EventService功能是Redfish規范中定義的一種事件日志的發送方式。用戶可以設置訂閱者信息(通常是一個web服務器)&#xff0c;當產生事件日志時&#xff0c;OpenBMC可以根據用戶設置的訂閱者信息與對日志的篩選設置&#xff0c;將事件日志發送到訂閱者。 相比于傳統的SNMPTrap日…

中斷嵌套、中斷咬尾、中斷晚到

中斷咬尾&#xff08;Tail-Chaining&#xff09;是一種通過減少上下文切換開銷來實現中斷連續響應的高效機制&#xff0c;其核心在于避免重復的出棧和入棧操作&#xff0c;從而顯著降低中斷延遲。以下是具體原理及實現方式&#xff1a; 中斷咬尾的運作機制 當多個中斷請求連續…

Vue2下載二進制文件

后端&#xff1a; controller: GetMapping(value "/get-import-template")public void problemTemplate(HttpServletRequest request, HttpServletResponse response) throws Exception {iUserService.problemTemplate(request, response);} service: void probl…