一个技术博客

(二) Mysql5.7 原生JSON格式支持 新增X plugin

本文由 Tim 于 2016-04-19 17:48:21 发表

一、原生JSON格式支持

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,通常使用VARCHAR或者TEXT。 并且由程序进行解析,之前MariaDB也有对非结构化的数据进行存储的方案,称为dynamic column,但是方案是通过BLOB类型的方式来存储。查询性能不高,不能有效建立索引。有兴趣的同学可以了解下dynamic column     通过MARIADB的DYNAMIC COLUMN功能实现非结构化存储

现在Mysql5.7.9(GA)InnoDB存储引擎已经原生支持JSON格式,该格式不是简单的BLOB类似的替换。原生的JSON格式支持有以下的优势:

(1)JSON数据有效性检查:BLOB类型无法在数据库层做这样的约束性检查
(2)查询性能的提升:查询不需要遍历所有字符串才能找到数据
(3)支持索引:通过虚拟列的功能可以对JSON中的部分数据进行索引

建表

将列data定义为了JSON类型。这意味着我们可以对插入的数据做JSON格式检查,确保其符合JSON格式的约束,如插入一条不合法的JSON数据会报错

插入一行,使用内置的json_object转换成JSON格式

此时jsontest表内数据如下

使用json_extract解析出来

可以看到json_object,json_extract类似php里的json_encode,json_decode; 同时Mysql还提供了合并多个Json格式的json_merge,移除元素的json_remove等

详见http://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

最令人的激动的功能应该是MySQL 5.7的虚拟列功能,通过传统的B+树索引即可实现对JSON格式部分属性的快速查询。使用方法是首先创建该虚拟列,然后在该虚拟列上创建索引:

为虚拟列添加索引

通过explain可以看到优化器已经选择了在虚拟列上创建的新索引。

 

二、X plugin存储文件数据

在Mysql最新发布的5.7.12(GA)上发布了X plugin,官方解释如下,大意为X plugin可以将Mysql扩展为文件数据库存储数据,X Plugin使用X Protocol协议连接,当基于ACID的存储引擎时可以实现事务等特性,提供接近NoSQL的操作。

X Plugin extends MySQL Server to be able to function as a document store. Running X Plugin enables MySQL Server to communicate with clients using the X Protocol, which is designed to expose the ACID compliant storage abilities of MySQL as a document store. Documents are stored in JSON format and enable schema-less storage. Using the X DevAPI you can use a NoSQL-like syntax to execute Create, Read, Update, Delete (CRUD) operations against these documents.

1、安装mysql-shell,官方安装文档

If you already have the MySQL Yum repository as a software repository on your system and the repository was configured with the new release package mysql57-community-release, skip to the next step (“Enable the MySQL Tools Preview subrepository…”).

看到如上这段,因为我之前装Mysql5.7时使用了MySQL Yum repository,因此直接到Enable the MySQL Tools Preview subrepository这一段,读者可以根据自行情况安装。

vi /etc/yum.repos.d/mysql-community.repo 添加如下段,并将修改enabled=1

安装mysql-shell

安装完成,可以看到Mysql shell 版本为1.0.3
此时在运行show plugins; 也可以看到

2、连接

第一次使用mysqlsh -u root -h localhost -p –classic –dba enableXProtocol 进行初始化,密码为Mysql的密码

mysqlsh默认端口为33060
使用mysqlsh –u root 连接,进入mysql-js命令行模式

\h可以查看帮助,\sql可以进入sql模式

 

导入示例库,world_x-db.zip下载地址http://downloads.mysql.com/docs/world_x-db.zip

解压后有两个文件,查看README.txt中有执行命令,写的很详细,看到需要MySQL Server 5.7.12 or higher

导入world_x-db.zip示例库

进入world_x示例库

查看数据

创建schema,可以看到在js模式创建会报错

需要切换到sql模式,不过sql模式需要运行在Node session,因此mysqlsh –session-type=node -u root -p world_x重新连接并进入sql模式

切换到testx

创建collection

 

切换回world_x示例库,这里数据多点,接下来在world_x内操作

db.CountryInfo.add()添加数据,要注意,输入完成后需要回车两次 

db.CountryInfo.find()查看

查找符合条件的,引号内还可以使用算术符号等,如db.CountryInfo.find(“GNP*1000000/demographics.Population > 30000”)

.bind关联多个字段条件,.fields([“GNP”, “Name”])显示选择字段,.limit(N)返回N行结果,.sort([“IndepYear desc”]) 排序 等,

更多增删改查可以参阅官方文档Documents and Collections,文档还有介绍Relational Tables,接近Mysql中的表操作。

感兴趣的同学可以切换到sql模式,查看下数据库testx下id的表结构

可以看到doc是json字段存储,id列索引是利用了5.7新特性虚拟列,为_id创建了一个唯一约束并存储到磁盘,利用的innodb引擎,这就可以让collection支持事物行锁等innodb引擎的特性。X plugin利用独有的协议可以模拟类似mongodb等No-sql的操作,很强大的功能。

欢迎转载,转载请注明出处!Tim » (二) Mysql5.7 原生JSON格式支持 新增X plugin

点赞 (1)or拍砖 (0)
分享到:更多 ()