MySQL如何索引JSON字段
MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型,也为广大的开发人员提供了便捷;但MySQL原生并不支持json列中的属性索引,至少没有直接对其字段进行索引的方法。但是我们可以通过mysql的虚拟列间接的为json中的某些属性创建索引,原理就是为json中的属性创建虚拟列,然后通过给虚拟列建立索引,从而间接的给属性创建了索引。
在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。在MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Generated Column。
下面我们就来实践一下通过MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段进行索引。
创建含有json类型字段的表
CREATE TABLE t_json_test (
id int(11) NOT NULL AUTO_INCREMENT,
col_json JSON not NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
show一下表结构
插入数据
insert into t_json_test (id,col_json) values (null,'{"title": "json","tester": "jack","keywords": ["JSON_Index","Virtual Generated Column","Create Index"]}');
insert into t_json_test (id,col_json) values (null,'{"title": "json","tester": "lucy","keywords": ["JSON_Index","Virtual Generated Column","Create Index"]}');
insert into t_json_test (id,col_json) values (null,'{"title": "json","tester": "peter","keywords": ["JSON_Index","Virtual Generated Column","Create Index"]}');
insert into t_json_test (id,col_json) values (null,'{"title": "json","tester": "lucky","keywords": ["JSON_Index","Virtual Generated Column","Create Index"]}');
查询一下插入的数据
如果要查询tester为jack的数据则可以使用以下SQL
select id,col_json from t_json_test where json_contains(col_json->'$.tester','"jack"');
创建一个虚拟列
alter table t_json_test add tester_v varchar(20) GENERATED ALWAYS AS (col_json ->> '$.tester') NOT NULL;
利用操作符-» 来引用JSON字段中的KEY,这里是将col_json里的tester这个key引用过来
看一下表t_json_test的字段
再来查看一下数据
虚拟字段以及引用的值也一并查出来了
根据虚拟列来查询tester为jack的数据
Select * from t_json_test where tester_v='jack';
explain一下看看执行计划
由于tester_v上并没有建索引所以是一个全表扫描
为虚拟列添加索引
alter table t_json_test add index idx_tester_v(tester_v);
再来看一下explain
可以看到最新的执行计划用到了索引idx_tester_v
由于数据量比较小,执行时间上看不出明显变化,有兴趣的同学可以实践一下并用10万行数据+来做一下对比
小结
由于MySQL原生并不支持json列中的属性索引,至少没有直接对其字段进行索引的方法。但是我们可以通过MySQL的虚拟列间接的为json中的某些属性创建索引,原理就是为json中的属性创建虚拟列,然后通过给虚拟列建立索引,从而间接的给json中的属性创建了索引。
亲爱的小伙伴,看完这篇文章你有什么收获呢?
欢迎留言
更多知识,扫描二维码
关注Dmall 技术
👇