我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

耐心阅读,会有收获的


〇. 从创建索引的要素说起

提示:数据版本:MySQL 8 +

首先需要知道,创建json数据字段的索引和普通字段的索引,在本质上没有区别。

为什么没什么区别?我们思考一下,创建一个索引的要素有哪些?我们需要提供什么信息?

  1. 表名,即要知道你要操作哪张表。
  2. 待创建索引的字段,毕竟索引是根据一个或多个字段来创建的。
  3. 待创建索引字段的数据类型。
  4. 待创建的索引名称, 需要唯一。

普通数据类型的字段, 如:int, char, unsigned等,我们很好提供上面的信息,例如:为student表的name CHAR(32)字段创建一个索引,语句为:【ALTER TABLE student ADD INDEX student_name_index(name);】,该语句中,student提供了1. 表名, name同时提供2. 待创建索引的字段,即student.name3.待创建索引字段的数据类型, 即CHAR(32)两种信息,student_name_index提供了4. 待创建的索引名称。拥有了这4个信息,我们可成功创建索引。

但可惜的是,MySQL不支持直接json数据类型创建索引,因此无法成功执行 【ALTER TABLE student ADD INDEX student_name_index(json_field_name);】。

因此,MySQL8引入了间接创建的方式。也就是,可以间接指定json数据的成员或者元素作为创建索引的字段,而字段对应的数据类型我们手动指定。

换句话说,就是为json数据的成员,提供2. 待创建索引的字段3.待创建索引字段的数据类型两种信息,从而拥有创建索引的4要素, 即可创建索引。因此,创建的语句区别,为标【有所区别,需要做改动的地方】的地方,
ALTER TABLE student ADD INDEX student_name_index(【有所区别,需要做改动的地方】);】,而本质上没有任何区别。

接下来将围绕着这一个区别 进行细致的讲解。

一. 创建索引

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

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

例如:有student表,拥有一个json类型的字段data,数据形如:{"id": 1, "name":"he"}

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

语法:ALTER Table 【表名】 ADD INDEX 索引名( ( CAST(【表中json的字段名】-> "$.【需要建立索引的数据成员名】" as【需要建立索引的数据成员的数据类型】 ARRAY) ) )

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

1.1 示例:为data字段数据中的name成员创建索引。

创建索引语句:ALTER Table student ADD INDEX student_name_index( ( CAST( data -> “$.name” as CHAR(32) ARRAY) );

2. 当数据为json数组

例如: 例如:有student表,拥有一个json类型的字段data,数据形如:["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等。

2.1 示例:当data字段数据为["1","2"],为数组中所有元素创建索引。

创建索引语句:ALTER Table student ADD INDEX student_data_index( ( CAST( data -> “$[*]” as CHAR(32) ARRAY) );

2.2 示例:当data字段数据为[{"id": 1, "name":"he"},{"id": 2, "name":"zhi"}],为数组中所有元素的成员id创建索引。

创建索引语句:ALTER Table student ADD INDEX student_data_index( ( CAST( data -> “$[*].id” as UNSIGNED ARRAY) );

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(         ( 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(         ( 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->'$[*]');

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

花了一整天写的文章,如果对你有帮助,希望能够点赞收藏一下,谢谢支持。

来源地址:https://blog.csdn.net/BREATH57/article/details/129320951

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在MySQL中创建唯一索引来确保数据唯一性

标题:MySQL中创建唯一索引来确保数据唯一性的方法及代码示例在数据库设计中,确保数据的唯一性是非常重要的,可以通过在MySQL中创建唯一索引来实现。唯一索引可以保证表中某列(或列组合)的数值是唯一的,如果尝试插入重复值,MySQL会阻止
如何在MySQL中创建唯一索引来确保数据唯一性
2024-03-15

MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)

在Python中为MySQL表创建和使用索引可以提高查询性能。使用create_index()方法创建索引,并使用filter()方法强制查询使用特定索引。最佳实践包括在经常用于where子句的列上创建索引,避免在经常更新的列上创建索引,并定期分析索引使用情况。Python提供内置函数get_indexes()、drop_index()和has_index()来管理索引。
MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)
2024-04-02

编程热搜

目录