MySQL如何索引JSON字段

Posted Dmall技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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一下表结构

MySQL如何索引JSON字段


插入数据


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"]}');


查询一下插入的数据


MySQL如何索引JSON字段

如果要查询tester为jack的数据则可以使用以下SQL

select id,col_json from t_json_test where json_contains(col_json->'$.tester','"jack"');

MySQL如何索引JSON字段


创建一个虚拟列


alter table t_json_test add tester_v varchar(20) GENERATED ALWAYS AS (col_json ->> '$.tester') NOT NULL;

利用操作符-» 来引用JSON字段中的KEY,这里是将col_json里的tester这个key引用过来

MySQL如何索引JSON字段

看一下表t_json_test的字段

MySQL如何索引JSON字段

再来查看一下数据

MySQL如何索引JSON字段

虚拟字段以及引用的值也一并查出来了


根据虚拟列来查询tester为jack的数据


Select * from t_json_test where tester_v='jack';


MySQL如何索引JSON字段

explain一下看看执行计划

MySQL如何索引JSON字段

由于tester_v上并没有建索引所以是一个全表扫描


为虚拟列添加索引


alter table t_json_test add index idx_tester_v(tester_v);

MySQL如何索引JSON字段

再来看一下explain

MySQL如何索引JSON字段

可以看到最新的执行计划用到了索引idx_tester_v

MySQL如何索引JSON字段

由于数据量比较小,执行时间上看不出明显变化,有兴趣的同学可以实践一下并用10万行数据+来做一下对比


小结


        由于MySQL原生并不支持json列中的属性索引,至少没有直接对其字段进行索引的方法。但是我们可以通过MySQL的虚拟列间接的为json中的某些属性创建索引,原理就是为json中的属性创建虚拟列,然后通过给虚拟列建立索引,从而间接的给json中的属性创建了索引。


亲爱的小伙伴MySQL如何索引JSON字段,看完这篇文章你有什么收获呢?

欢迎留言


更多知识,扫描二维码

关注Dmall 技术

以上是关于MySQL如何索引JSON字段的主要内容,如果未能解决你的问题,请参考以下文章

当 MySql 不支持 json 索引时,Javers 如何处理对 json 值字段的频繁查询?

mysql json字段中数值的加减

如何在 Postgres 中的 JSON 字段上创建索引?

mysql时间字段加索引后如何生效

PHP如何取得mysql字段值并记算时间?

Rails - 如何在索引控制器方法中使用额外字段渲染json