您现在的位置是:首页 > 正文

MYSQL json数组创建多值索引

2024-02-01 04:23:18阅读 1

创建多值索引目的:mysql8多值索引 Multi-Valued Indexes,提高Json字段的查询效率
创建多值索引的两个前提条件
1:mysql数据库版本8.0.17及以上
2:查找的列类型是json数组

多值索引特定的语法定义:
CAST(expression AS type ARRAY),例如CAST(data->‘$.value’ AS UNSIGNED ARRAY)。
其中,type包含:

  • BINARY[(N)] - CHAR[(N)] [charset_info] - DATE - DATETIME - TIME - DECIMAL[(M[,D])] - SIGNED [INTEGER] - UNSIGNED [INTEGER]

例如table_name 表的json_column_name列存的值为

[
	{
		"param_name":  "name1",
		"type": "type1",
		"param_value": "11111111111111",
		"issued": null,
		"otherInfo": null
	},
	{
		"param_name":  "name2",
		"type": "type2",
		"param_value": "000000000000000",
		"issued": null,
		"otherInfo": null
	}
]

创建多值索引语句:


--  创建索引的方式分为两种,CREATE index 和 ALTER TABLE;
--  索引的类型又分两种,值是数字和值是字符串的
--  $[*].param_value为纯数字,关键字 UNSIGNED
CREATE index `index_name` on  `table_name `(( CAST(`json_column_name`->'$[*].param_value'  AS UNSIGNED)  ARRAY)));

--  $[*].param_name为字符,关键字 char(128)
ALTER TABLE `table_name` ADD INDEX `index_name `( ( CAST( `json_column_name` -> '$[*].param_name' AS char(128) ARRAY)));

ps:查看索引是否创建成功执行语句:

--  看【结果】中key_name列是否含 index_name 
show keys from lss_gwl_entity;

在这里插入图片描述

查询语句:

-- 主要使用以下两种查询语句
1、SELECT * FROM table_name where 'name2' member of ( json_column_name->'$[*].param_name') ;
2、SELECT * FROM table_name where JSON_CONTAINS(json_column_name->'$[*].param_name' , cast('["name2"]' as json));

-- 此方法会不走索引,导致查询速度慢,加了索引的前提下切勿使用
3、SELECT * FROM table_name where JSON_CONTAINS(json_column_name, JSON_OBJECT('param_name', 'name2'));

常见报错:

1:1064 - You have an error in your SQL syntaxcorresnonds to wour Wwcheck the manual that corresponds to your MySOL server version for the right syntax touse near ‘array)))’ at line 2
在这里插入图片描述

问题原因:MYSQL版本太低
解决:需要升级到8.0.17及以上

2:3903 - Invalid JSON value for CAST for functional index
"index_name ’

问题原因:创建索引时,$[*].param_name 值类型不匹配
解决:纯数字选UNSIGNED,字符选 char(128)

大家还踩过什么坑,可以一起讨论~

网站文章

  • VMware日志收集方法总结

    VMware日志收集方法总结

    https://www.kclouder.cn/vmware-log-collection/ VM VMware的产品线很多,非常庞大,每种产品都有Diagnostic Information的收集方...

    2024-02-01 04:23:10
  • 安兔兔上html5是什么意思,除了安兔兔跑分,还有这6种办法能证明手机强弱

    安兔兔上html5是什么意思,除了安兔兔跑分,还有这6种办法能证明手机强弱

    现在说起手机跑分,已经稀松平常,但早在五年前,很多手机用户根本不知道如何测试手机性能。“跑分”这个词汇只会出现在媒体的评测文章里。后来,雷布斯捧着小米1代杀到了手机行业,第一句话就是“跑个分呗”,于是...

    2024-02-01 04:22:40
  • 实验15:20211127 Java大数据1+X 中级实操考试(id:2660)

    实验15:20211127 Java大数据1+X 中级实操考试(id:2660)

    【5 分】步骤 1:项目准备【5 分】步骤 2:完成实体类 Student【10 分】步骤 3:完成实体类 Course【10 分】步骤 4:完成实体类 Score【10 分】步骤 5:完成 Stud...

    2024-02-01 04:22:34
  • pytorch里的nn.Embedding是什么东西?

    pytorch里的nn.Embedding是什么东西?

    2024-02-01 04:22:18
  • [NepCTF2022] 复现

    [NepCTF2022] 复现

    www.zip源码泄露,啥也不懂没注意正确的入口在哪里,一直把注意力放在web.php上面。附件下载后是个osz后缀,当时用010看是压缩包文件头,就改后缀了。当时写的过程,确实9.12.2的版本也是...

    2024-02-01 04:22:11
  • aes key长度_AES 自动打分 Automated Essay Scoring

    aes key长度_AES 自动打分 Automated Essay Scoring

    文章自动打分简称 AES (Automated Essay Scoring),AES 系统利用 NLP 技术自动对文章进行打分,可以减轻阅卷人员的负担。目前有不少大型的考试都采用了 AES 算法进行作...

    2024-02-01 04:21:42
  • 图解TCP/udp及socket

    图解TCP/udp及socket

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 协议的关系图

    2024-02-01 04:21:36
  • 英文地址怎么写?!!

    北京市东花市北里20号楼6单元501室Room 501 ,Unit 6,Building 20 North Donghuashi Residential Chongwen District BeiJi...

    2024-02-01 04:21:29
  • Redis基本概念及发展历史

    redis NOSQL(not only SQL)数据库 Jedis是Redis在Java中的常用客户端(依赖包),提供多种方法操作redis 数据类型 类型 结构 string key(string...

    2024-02-01 04:21:00
  • java将网络资源url转换成File文件

    【代码】java将网络资源url转换成File文件。

    2024-02-01 04:20:54