码迷,mamicode.com
首页 > 数据库 > 详细

mysql与Json学习总结

时间:2018-12-09 18:40:44      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:fast   判断   5.7   null   blob类型   fas   search   索引   span   

mysql在5.7以后InnoDB存储引擎已经开始对json数据进行支持,对json支持有如下优势:

  • JSON数据有效性检查:BLOB类型无法在数据库层做这样的约束性检查,如不合法会报错:
  • 查询性能的提升:查询不需要遍历所有字符串才能找到数据
  • 支持索引:通过虚拟列的功能可以对JSON中的部分数据进行索引
  • 存储的容量大,近似于LongBlob与LongText(4G)

建表语句:

CREATE TABLE `employe` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(18) DEFAULT NULL,
  `sex` int DEFAULT NULL,
  `others` json DEFAULT NULL,
  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 录入时间,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42334 DEFAULT CHARSET=utf8mb4;

技术分享图片

 获取JSON中的某个字段的风格与alibaba中fastjson中的JSONPath类似,但是功能与之相差甚远:

  • .    属性访问,例如$.name
  • $   根对象,即当前json
  • *   对象的所有属性,如:$.* ,当为JSONArray时,$.* 无效

  

其中支持json的主要函数如下表:或见https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

技术分享图片

 简单列一下常用操作,便于记忆:

  •  JSON_EXTRACT(column_name,‘$.name‘)返回该json列column中的name中的值
  • JSON_SEARCH(others, ‘one‘, "露露")   若该字段存在,返回路径,若不存在返回null:select * from employe where JSON_SEARCH(others, ‘one‘, "露露") is not null;//查找存在“露露”的记录;该方法中的中间参数有“one”与“all”两种,one返回该json中第一次找到的记录路径,all返回该json中所有找到的路径,即若存在多个“露露”则返回多个露露的路径
  • JSON_TYPE(others) 判断alias的json类型(ARRAY或者OBJECT)
  • JSON_VALID(others) 判断alias 是否是一个合法的json

 

虚拟列:虚拟列类似于视图,将others字段中的address提取出来作为一个虚拟列address,当others字段中的address发生改变时,虚拟列会同时改变。

ALTER TABLE employe ADD address varchar(128) GENERATED ALWAYS AS (json_extract(others,$.address)) VIRTUAL;
技术分享图片

若去掉address列的引号可用replace替换:

ALTER TABLE employe ADD address varchar(128) GENERATED ALWAYS AS (REPLACE(json_extract(others,‘$.address‘),"\"",‘‘)) VIRTUAL;

可对该虚拟字段进行查询:

select * from employe where address="北京昌平";

 在MySQL 5.7中,支持两种generated column,即virtual generated column和stored generated column,前者只将generated column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将generated column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与virtual column相比并没有优势,因此,MySQL 5.7中,不指定generated column的类型,默认是virtual column。

 

 虚拟索引:虚拟列与普通列类似可创建索引,虚拟索引列也是通过传统的B+树索引即可实现对JSON格式部分属性的快速查询。使用方法是首先创建该虚拟列,然后在该虚拟列上创建索引:

alter table employe add INDEX add_index(address);

 在创建索引后执行语句select * from employe where address="北京昌平";如下图,发现使用到了索引: 技术分享图片

 

效率问题:关于效率方面,使用json报错或将json转化为多表存储的效率对比参考https://www.cnblogs.com/lkpnotice/p/6903187.html

 

mysql与Json学习总结

标签:fast   判断   5.7   null   blob类型   fas   search   索引   span   

原文地址:https://www.cnblogs.com/smallProgrammer1/p/10091950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!