时间:2021-05-23
MySQL5.7版本开始支持JSON格式,在创建表时,可以指定列表的数据类型为JSON,但是如何在JSON格式上创建索引呢??
本人做了一个简单测试。
第一步:建立一个包含JSON类型的表:
CREATE TABLE json_test` ( id` int (8) NOT NULL AUTO_INCREMENT, content` json NOT NULL , PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;第二步:初始化数据
insert into json_test(content) value( '{"name":"zhangsan","age":18}' );insert into json_test(content) value( '{"name":"lisi","age":19}' );insert into json_test(content) value( '{"name":"wangwu","age":20}' );第三步:查询JSON类列的数据
select json_extract(content, '$.name' ) from json_test where json_extract(content, '$.name' )= "zhangsan" ;
通过expain分析改查询语句,发现其走全表扫描
在网上查询资料,得知如果要在JSON列上进行检索,需要对检索的key创建虚拟列,然后再虚拟列上创建索引
第四步:在content列上,对"name"建立虚拟列
ALTER TABLE json_test ADD name_virtual varchar (32) GENERATED ALWAYS AS (json_extract(content, '$.name' )) VIRTUAL;
第五步:对虚拟列创建索引
CREATE INDEX name_virtual_index ON json_test(name_virtual);
再次做查询( 注,where条件需要使用虚拟列来进行检索,如果直接用JSON列比较,还是会走全表扫描 )
explain select json_extract(content, '$.name' ) from json_test where name_virtual= "zhangsan" \G
总结:
其实MySQL通过一种空间换时间的做法,类似创建一个触发器,把JSON列上的数据冗余存储到虚拟列上,比较的时候通过走虚拟列的索引,再定位到实际数据。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在上篇文章给大家介绍了Mysql5.7忘记root密码及mysql5.7修改root密码的方法Mysql5.7忘记密码快速且简单的解决方法,具体方法详情如下所示
mysql5.7版本:方法1:用SETPASSWORD命令格式:mysql>setpasswordfor用户名@localhost=password('新密码'
推荐阅读:Mysql5.7忘记root密码及mysql5.7修改root密码的方法Mac安装和卸载Mysql5.7.11的方法系统是cenos6.764位的,默
MySQL8带来了全新的体验,比如支持NoSQL、JSON等,拥有比MySQL5.7两倍以上的性能提升。本文讲解如何在Windows下安装MySQL8,以及基本
错误发生情况:将数据库从mysql5.7导出为sql,在mysql5.5上进行导入,报sql语句错误:datetime(0)…错误发生原因mysql5.7和my