简单谈谈MySQL5.7 JSON格式检索
2017-01-01 14:29
841 查看
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列上的数据冗余存储到虚拟列上,比较的时候通过走虚拟列的索引,再定位到实际数据。
您可能感兴趣的文章:
相关文章推荐
- MySQL 5.7原生JSON格式支持
- mysql json格式字段的简单用法
- MySQL 5.7原生JSON格式支持
- MySQL 5.7原生JSON格式支持
- MySQL 5.7原生JSON格式支持
- MySQL 5.7原生JSON格式支持
- MySql 5.7 json数据格式 增删改查 操作 (不定时更新)
- MySql5.7前提取json格式文件
- session共享,格式json,php不能简单的设置session.serialize_handler=json,目前只有php,wddx(xml),安装扩展后还有igbinary(二进制)
- 最简单的c#处理程序输出json格式数据
- JSONArrayBuilder:用于生成格式简单的json array字符串
- jqGrid使用经验分享(一)——jqGrid简单使用、json格式和jsonReader介绍
- MySQL 存储php中json_encode格式中文问题及解决
- php里少用到的session_module_name,以及session的key值限制,简单将session存储为json格式数据的方法
- delphi生成JSON格式字符串的一个简单的类
- php查询mysql,返回json格式数据
- mysql中存不进去json_encode格式的数据
- jquery 对 cookie存储 json格式的简单操作
- 谈谈JSON数据格式
- java生成json格式数据,一个简单的class