数据库中的数组: 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.mzph.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…