MySQL5.7 JSON类型列创建索引查询一例
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,创建json类型的表test:mysql> CREATE TABLE test(data JSON);Query OK, 0 rows affected (0.47 sec)mysql> insert
千家信息网最后更新 2025年11月06日MySQL5.7 JSON类型列创建索引查询一例创建json类型的表test:
mysql> CREATE TABLE test(data JSON);
Query OK, 0 rows affected (0.47 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["1","2"]}');
Query OK, 1 row affected (0.39 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["2","3"]}');
Query OK, 1 row affected (0.39 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["3","4"]}');
Query OK, 1 row affected (0.39 sec)
mysql> select json_type(data) from test;
+-----------------+
| json_type(data) |
+-----------------+
| OBJECT |
+-----------------+
1 row in set (0.15 sec)
mysql> select * from test;
+---------------------------------------------------+
| data |
+---------------------------------------------------+
| {"sex": "nan", "area": ["1", "2"], "name": "abc"} |
+---------------------------------------------------+
1 row in set (0.10 sec)
mysql> select json_extract(data, '$.name' ) from test;
+-------------------------------+
| json_extract(data, '$.name' ) |
+-------------------------------+
| "abc" |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select json_extract(data, '$.sex' ) from test;
+------------------------------+
| json_extract(data, '$.sex' ) |
+------------------------------+
| "nan" |
+------------------------------+
1 row in set (0.00 sec)
mysql> select json_extract(data, '$.area' ) from test;
+-------------------------------+
| json_extract(data, '$.area' ) |
+-------------------------------+
| ["1", "2"] |
+-------------------------------+
1 row in set (0.00 sec)
在data列上,对"area"建立虚拟列
mysql> ALTER TABLE test ADD data_idx varchar(128) GENERATED ALWAYS AS (json_extract(data,'$.area')) VIRTUAL;
Query OK, 0 rows affected (0.93 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果要在JSON列上进行检索,需要对检索的key创建虚拟列,然后再虚拟列上创建索引。
mysql> alter table test add index idx_data(data_idx);
Query OK, 0 rows affected (0.67 sec)
Records: 0 Duplicates: 0 Warnings: 0
where条件需要使用虚拟列来进行检索,执行计划如下:
mysql> explain select * from test where data_idx='["3", "4"]';
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| 1 | SIMPLE | test | NULL | ref | idx_data | idx_data | 387 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.04 sec)
发现走了索引
mysql> CREATE TABLE test(data JSON);
Query OK, 0 rows affected (0.47 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["1","2"]}');
Query OK, 1 row affected (0.39 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["2","3"]}');
Query OK, 1 row affected (0.39 sec)
mysql> insert into test values('{"name":"abc","sex":"nan","area":["3","4"]}');
Query OK, 1 row affected (0.39 sec)
mysql> select json_type(data) from test;
+-----------------+
| json_type(data) |
+-----------------+
| OBJECT |
+-----------------+
1 row in set (0.15 sec)
mysql> select * from test;
+---------------------------------------------------+
| data |
+---------------------------------------------------+
| {"sex": "nan", "area": ["1", "2"], "name": "abc"} |
+---------------------------------------------------+
1 row in set (0.10 sec)
mysql> select json_extract(data, '$.name' ) from test;
+-------------------------------+
| json_extract(data, '$.name' ) |
+-------------------------------+
| "abc" |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select json_extract(data, '$.sex' ) from test;
+------------------------------+
| json_extract(data, '$.sex' ) |
+------------------------------+
| "nan" |
+------------------------------+
1 row in set (0.00 sec)
mysql> select json_extract(data, '$.area' ) from test;
+-------------------------------+
| json_extract(data, '$.area' ) |
+-------------------------------+
| ["1", "2"] |
+-------------------------------+
1 row in set (0.00 sec)
在data列上,对"area"建立虚拟列
mysql> ALTER TABLE test ADD data_idx varchar(128) GENERATED ALWAYS AS (json_extract(data,'$.area')) VIRTUAL;
Query OK, 0 rows affected (0.93 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果要在JSON列上进行检索,需要对检索的key创建虚拟列,然后再虚拟列上创建索引。
mysql> alter table test add index idx_data(data_idx);
Query OK, 0 rows affected (0.67 sec)
Records: 0 Duplicates: 0 Warnings: 0
where条件需要使用虚拟列来进行检索,执行计划如下:
mysql> explain select * from test where data_idx='["3", "4"]';
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| 1 | SIMPLE | test | NULL | ref | idx_data | idx_data | 387 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.04 sec)
发现走了索引
检索
索引
类型
条件
查询
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
部队做好网络安全使用管理
x86服务器属于通用服务器吗
许继网络安全监测装置说明
当年微信服务器损坏
将数据库设置成单用户模式
网络安全法 日志60天
上位机软件开发平台对比
笔记本网线和服务器怎么链接
大学生网络安全小论文题目
安和网络安全
软件开发方面的劳动技能有哪些
我的世界基岩版服务器种子
网络安全的网络新词
利用数据库汇总工程量
大芒果web服务器
软件开发细节事项
安卓应用软件开发区海边
领导对网络安全工作作出指示
24号网络安全会议
千峰网络安全
无锡手机软件开发创新服务
青少年网络安全防范手抄报
有没有服务器招管理员
ad域服务器ssl证书验证
联通网络安全宣传语
第五章 数据库保护
手机软件开发概念股票
零基础自学嵌入式软件开发
腾讯云服务器存放数据怎么读取
原神小米手机登录的是什么服务器