注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

MySQL 5.7原生JSON格式支持  

2016-11-20 09:05:33|  分类: Mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
大家都知道,其实MySQL 5.7.7 labs版本开始InnoDB存储引擎已经支持JSON格式,该格式不是简单的BLOB类似的替换【即将JSON格式字符串存入BLOB字段,读取的时候再相应处理】,而是原生的JSON格式支持,有以下的优势:
1)格式有效性检查:BLOB类型字段就无法在数据库层做这样的约束性检查
2)基于索引查询性能的提升:查询不需要遍历所有字符串才能找到数据
3)支持虚拟列索引:通过虚拟列的功能可以对JSON中的部分数据进行索引
有了这个功能之后,那么我们可以来尝试下:

mysql> create table site ( id int auto_increment, data json,primary key(id))engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into site values (NULL, '{"name":"593668","url":"http://593668.com","address":"shenzhen"}');
Query OK, 1 row affected (0.00 sec)

mysql> insert into site values (NULL,'{"name":"237h","url":"http://237h.com"}');
Query OK, 1 row affected (0.00 sec)

创建了一个表site,可以看到data字段就是json格式,而且这个格式可以并不固定,但是必须是json格式,否则会报错。

mysql> insert into site values (NULL,"test");
ERROR 3130 (22032): Invalid JSON text: "Invalid value" at position 2 in value (or column) 'test'.

而且可以利用jsn_extract直接提取字段中的相关值:

mysql> select json_extract(data, '$.name') as name,json_extract(data,'$.address') as address from user;

+-----------------------------+-------------------------------+
| name | address |
+-----------------------------+-------------------------------+
| "593668" | "shenzhen" |
| "237h" | NULL |
+-----------------------------+-------------------------------+
2 rows in set (0.00 sec)

另外,其实还有一个令人心动的虚拟列功能,即通过传统的B+树索引即可实现对JSON格式部分属性的快速查询。实现方法是首先创建该虚拟列,然后再在该虚拟列上创建索引【这个听起来其实很大上,其实也很简单,就是可以直接将Json格式中的数据直接as一个字段】:

mysql> ALTER TABLE site ADD site_name varchar(128) GENERATED ALWAYS AS (json_extract(data,'$.name')) VIRTUAL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select site_name from site;
+-----------+
| user_name |
+-----------+
| "593668" |
| "237h" |
+-----------+
2 rows in set (0.00 sec)

mysql> alter table site add index idx_name (site_name);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

可以看到,这个跟以前在函数上做索引也没有太大的区别。当然这样的话,相关的快速查询肯定也会很给力。可以用explain验证优化器已经选择了在虚拟列上创建的新索引。

mysql> explain select * from site where site_name='"593668"'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: site
partitions: NULL
type: ref
possible_keys: idx_name
key: idx_name
key_len: 131
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)

这样的话,其实有很多字段数量需要灵活弹性的项目就可以采用这种格式了,而不用象之前一样,那怕有些属性并不是每行记录都有,也必须要创建这样一个字段。当然,对于文档数据库这些主打json支持的阵营来说,卖点被击溃,可能已经哭晕在厕所了吧。
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017