MySQL5.7 JSON类型列创建索引查询一例
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,创建json类型的表test:mysql> CREATE TABLE test(data JSON);Query OK, 0 rows affected (0.47 sec)mysql> insert
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
喔噻互联网科技有限公司
深圳九邦互联网科技有限公司
广州大一互联网络科技有限公司
金诺互联网科技
金融科技 互联网金融
科技服务与互联网
丰台科技园 互联网
亿账通互联网科技
互联网金融 科技创新
互联网科技素材视频竖屏
互联网科技产品
青岛中康互联网医疗科技有限公司
移动互联网科技公司
哈尔滨屹滨互联网科技有限公司
晋城互联网科技
合肥互联网科技公司公章图片
高科技互联网套路
艺电能源互联网科技有限公司招聘
互联网金融金融科技
承德科技产业互联网平台
互联网金融监管科技数据
互联网巨头科技公司
嘟嘟瓜互联网科技
兼蜜互联网科技
哈尔滨秒房互联网科技有限公司
上海电发互联网科技有限公司
互联网金融中的现代科技
无锡工业互联网科技有限公司
安徽零酒互联网科技有限公司
第三届互联网大会安防黑科技