【这一篇就够】mysql创建JSON数据的索引

news2025/4/10 15:45:16

一. 创建索引

由于json有两类不同的数据形式,即:json对象(如:{"id": 1, "name":"he"}),json数组(如:["1","2","3"]),因为进行分开讲解。

1. 当字段的数据为json对象

例如:{"id": 1, "name":"he"}

【内容】为需要自行替换的部分

语法:ALTER Table 【表名】 ADD INDEX 索引名( ( CAST(【表中json的字段名】 as【json数据中需要创建索引的数据类型】 ARRAY) ) )

其中,【成员名对应的数据类型】自行参考数据MySQL8拥有的数据类型,例如可填:CHAR(32), UNSIGNED等。

2. 当数据为json数组

例如: ["1","2"][{"id": 1, "name":"he"},{"id": 2, "name":"zhi"}]

【内容】为需要自行替换的部分

语法:ALTER Table 【表名】 ADD INDEX 索引名( ( CAST(【表中json的字段名】 -> '$[*].【需要作为索引的json数据的成员名】' as 【成员名对应的数据类型】‘ ARRAY) ) )

其中, $[*]代表数据中的每个元素,也就是将会让所有的元素加入索引,例如:第x行的数据为["1","2"],索引中将有"1""2"都对应到x行;若为$[0],那么只会将每行的第一个元素加入索引。

此外,【成员名对应的数据类型】自行参考数据mysql拥有的数据类型,例如:CHAR(32), UNSIGNED等。

3. 当数据为json数组,但内部元素不为json对象

例如:["1","2", "3"]就是为json数组,但内部元素不为json对象的数据,使用上述的1.2.的语法都可,推荐使用2.语义更为明确。下方的示例,展示这种特殊的情况。

二. 具体示例(内部元素不为json对象json数组

1. 表定义和数据准备

-- 创建表
DROP TABLE IF EXISTS `test`;
CREATE TABLE test ( 
	id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    jchararr JSON NOT NULL COMMENT "元素为char类型的json数组"
);

-- 插入数据
INSERT INTO 
    test (jchararr) 
VALUES 
    ('["1","2","3"]'),
    ('["1"]'),
    ('[]'),
    ('["4","2","3"]');

2. 为jchararr 字段中的每个元素创建索引

接下来将展示两种不同的方式。

2.1 方式1

2.1.1 创建索引

ALTER Table test ADD INDEX jchararr_index(
     /* 由于数组中的元素类型,sql不知道,需要手动指定数组中的元素的类型为Char*/
    ( CAST(`jchararr` as CHAR(32) ARRAY) )
);

2.1.2 触发索引的查询方式

SELECT * FROM test WHERE '2' MEMBER OF(jchararr);

2.2.3 性能分析

EXPLAIN SELECT * FROM test WHERE '2' MEMBER OF(jchararr);

运行结果:
在这里插入图片描述

2.1.4 【方式1】的局限性

只适用于当字段的数据为[1,2,3,4,4]或者['a','b','c']的json数组,而若是[{"id": 1},{"d": 2'}]这样的数据,需创建id的索引,并不支持,因为仅通过CAST(jchararr as CHAR(32) ARRAY)是无法让mysql知道[{"id": 1},{"d": 2'}]中有id这个成员和它的数据类型。当然方式2可以通过$[*].member_namejson内部成员访问符,进行指定,从而解决该问题。

2.2 方式2

2.2.1 创建语句

ALTER Table test ADD INDEX jchararr_index_2(
     /* 由于数组中的元素类型,sql不知道,需要手动指定数组中的元素的类型为Char*/
    ( CAST(`jchararr`->'$[*]' as CHAR(32) ARRAY) )
);

上述的$[*]'代表json数组中的所有元素,若元素类型为json对象,如:[{"id": 1},{"d": 2'}],则需改成$[*].id

2.2.2 触发索引的查询方式

SELECT * FROM test WHERE '2' MEMBER OF(jchararr->'$[*]');

上述的$[*]'代表json数组中的所有元素,若元素类型为json对象,如:[{"id": 1},{"d": 2'}],则需改成$[*].id

2.2.3 性能分析

EXPLAIN SELECT * FROM test WHERE '2' MEMBER OF(jchararr->'$[*]');

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nexus安装与入门

安装 nexus-3.31.1-01-unix.tar.gz 链接:https://pan.baidu.com/s/1YrJMwpGxmu8N2d7XMl6fSg 提取码:kfeh 上传到服务器,解压 tar -zvxf nexus-3.31.1-01-unix.tar.gz进入bin目录,启动 ./nexus start查看状态 ./nexus status默…

初始Linux操作系统

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

Linux常用命令等

目录 1.Linux常用命令 (1)系统命令 (2)文件操作命令 2.vim编辑器 3.linux系统中,软件安装 (1) rpm 安装,RedHat Package Manager (2)yum 安装 (3)源代码编译安装 1.Linux常用命令 Linux命令是非常多的,对于像嵌入式开发工程师,运维工程师需要掌握的命令是非常多的.对于…

旋转矩形框标注--roLabelImg的使用

1. 旋转目标标注roLabelImg roLabelImg是一款开源的,可标注带旋转角度的矩形区域的标注软件。roLabelImg源码github地址: https://github.com/cgvict/roLabelImg labelme和labelimg只能标矩形框,但不能标注旋转角度。roLabelImg既能标矩形框也能标注矩形框的选择角度,因此…

复旦发布中国版 ChatGPT :MOSS

不知道这个人工智能,有没有获得完整的一生。ChatGPT 是最先进的 AI,也是最热门的应用 —— 自去年 11 月底发布以来,它的月活跃用户两个月超过一亿,轻松拿到了全球互联网史上用户增长速度的第一。它也是一种门槛很高的技术。由于 …

服务预热配置化在泛型化方法上的实践

背景 由于开发过程中,个别dubbo接口的调用会在服务发布过程中,出现P99耗时报警问题。因此我们计划通过预热服务接口,通过预热来触发JIT,构建DB资源长链接。实现服务接口上线后,耗时过长,资源等待等问题&am…

基于RWEQ模型的土壤风蚀模数估算及其变化归因分析

查看原文>>>基于RWEQ模型的土壤风蚀模数估算及其变化归因分析 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff…

python re模块匹配字符串

python 正则模块re 要使用python3中的RE则必须引入 re模块 import re re模块的match函数 result re.match(^[A-Z]{1}[a-z], s) match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 匹配到了,则…

AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

AI for Science被广泛认为是下一代科研范式,可以有效处理多维度、多模态、多场景下的模拟和真实数据,解决复杂推演计算问题,加速新科学问题发现[1] 。百度飞桨科学计算工具组件赛桨PaddleScience是国内首个公开且可应用于CFD(Comp…

通过工厂模式实现SpringBoot+MQTT-订阅与消费

引言 Spring Boot 是一款用于构建基于 Spring 框架的快速应用程序的开源框架。它的目标是简化 Spring 应用程序的开发和部署过程,Spring Boot 通过提供一些默认配置和自动配置,可以让开发者更快的创建一个独立的、产品级别的 Spring 应用程序。 MQTT 是…

pathon Django的关系映射

一对一 【创建】 一对一是表示现实事物间存在的一对一的对应关系。特殊字段选项 【必须】 on_delete - 级联删除 更多参考模型字段参考 | Django 文档 | Django使用oto示例: 1、先创建oto应用,然后到setting.py文件注册应用2、创建oto模型类3、创建…

【人工智能 AI】机器学习快速入门教程(Google)

目录 机器学习术语 标签 特性 示例 模型 回归与分类 深入了解机器学习:线性回归 深入了解机器学习:训练和损失 平方损失函数:一种常用的损失函数 机器学习术语 预计用时:8 分钟 什么是(监督式&#xff…

蚁群算法再优化:combine aco algorithm with Sarsa in RL

蚁群算法再优化:combine aco algorithm with Sarsa in RL蚁群算法、Sarsa介绍和TSP问题介绍TSP和Sarsaaco algorithm具体的改进和代码改进说明部分代码数值实验结论分析参考文献蚁群算法、Sarsa介绍和TSP问题介绍 在进行蚁群算法优化介绍之前,笔者先将涉…

Apache Pulsar 云原生消息中间件之王

一、简介 pulsar,消息中间件,是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势。 pulsar采用发布-订阅的设计模式,producer发布消息到topic,consumer订阅这些topic处理流入的消息,并当处理完…

OIDC OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接入 Authing

在上一篇文章OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接入 Authing中,我们整体介绍 OIDC / OAuth2.0 协议,本次我们将重点围绕授权码模式(Authorization Code)以及接…

RabbitMQ第一讲

目录 一、RabbitMQ-01 1.1 MQ概述 1.2 MQ的优势和劣势 1.2.1 优势 1.2.2 劣势 1.2.3 MQ应用场景 1.2.4 常用的MQ产品 1.3 RabbitMQ的基本介绍 1.3.1 AMQP介绍 1.3.2 RabbitMQ基础架构 1.3.3 RabbitMQ的6种工作模式 ​编辑 1.4 AMQP和JMS 1.4.1 AMQP 1.4.2 JMS …

00后跨专业学软件测试,斩获8.5K高薪逆袭职场

我想说的第一句:既然有梦想,就应该去拼搏还记得,我大学毕业前,就已经暗下决心到xxx培训机构接受培训。那个时候,没有任何海同公司的人主动找我或者联系过我,我是自己在网上发现了xxxx培训机构的&#xff01…

PLC实验—西门子S7 1200 PID控制步进电机转速

PLC实验—西门子S7 1200 PID控制步进电机转速 严格讲并不是PID控制,因为并不是并不研究这个方向,研二又比较忙,时间限制只加了比例系数 这里只是抛砖引玉,希望大家可以进一步完善补充 思路 大体思路如下,根据超声波…

三八节买什么数码好物?三八女神节实用不吃灰的数码好物推荐

三八节快到了,在这个小节日里,有哪些实用性强的数码好物值得入手呢?针对这个问题,我来给大家推荐几款实用性超强的数码好物,一起来看看吧。 一、蓝牙耳机 推荐产品:南卡小音舱 参考价:239 南…

Python中Opencv和PIL.Image读取图片的差异对比

近日,在进行深度学习进行推理的时候,发现不管怎么样都得不出正确的结果,再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的。 image np.array(Image.open(image_file).convert(RGB)) image cv2.imread(…