随着NOSQL数据库的广泛应用,可扩展的存储方式在关系型数据库中也有了很好的支持,最新的MySQL5.7中就新增加了一个数据类型:JSON
使用示例:
插入一条数据
insert into vince.test(`data`) values('{"name":"tomcat","age":15}');
更新数据
UPDATE `vince`.`test` SET `data` = '{"name":"vincent","age":14}' WHERE `id` = 1;
查询JSON里的值
#利用JSON方法查询 select JSON_EXTRACT(data,'$.name'),JSON_EXTRACT(data,'$.age') from vince.test;返回结果
可以看出JSON被解析拆分,但对于字符串会保留双引号,这种是利用函数方法进行JSON提取的,还可以利用虚列virtual
#将JSON中的某一属性设置为虚列 alter table vince.test add test_name varchar(128) generated always as (JSON_EXTRACT(data,'$.name')) virtual;有了虚列后就可以直接用虚列作为条件查询
select test_name from vince.test; #根据虚列查询 explain select * from vince.test where test_name='vince'; select * from vince.test where test_name='"vincent"';
通过执行计划可以看出是否走索引和where条件,对于虚列还可以增加索引,就像普通的列一样,不过更新时不需要对虚列再进行更新,直接更新JSON的内容后,虚列会同步更新,因为虚列其实就是个引用,不会冗余存储
增加虚列的SQL:
alter table vince.test add index index_virtual (test_name);再用执行计划查看是否走索引
explain select * from vince.test where test_name='vince';
从结果上看已经走索引了,优化效果达到