10分钟了解MySQL5.7对原生JSON的支持与用法

Part1:JSON格式的支持

MySQL5.7版本终于支持了原生的JSON格式,即将关系型数据库和文档型NO_SQL数据库集于一身。本文接下来将对这特性分别就MySQL5.7和MariaDB10.1各自实现的方法异同进行介绍和演示。

Part2:创建相应表结构

[[email protected] ~]# mysql -V

mysql  Ver 14.14 Distrib 5.7.15, for linux-glibc2.5 (x86_64) using  EditLine wrapper


mysql> create database helei;
Query OK, 1 row affected (0.00 sec)
mysql> use helei;
Database changed
mysql> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id));
Query OK, 0 rows affected (0.02 sec)
mysql> show create table helei \G
*************************** 1. row ***************************
       Table: helei
Create Table: CREATE TABLE `helei` (
  `id` int(10) unsigned NOT NULL,
  `context` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.02 sec)


Part3:构造数据&测试

mysql> desc helei;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| id      | int(10) unsigned | NO   | PRI | NULL    |       |
| context | json             | YES  |     | NULL    |       |
+---------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into helei values(1,‘{"name":"贺磊","age":100}‘),(2,‘{"name":"陈加持","age":30}‘),(3,‘{"name":"于浩","age":28}‘);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from helei;
+----+----------------------------------+
| id | context                          |
+----+----------------------------------+
|  1 | {"age": 100, "name": "贺磊"}     |
|  2 | {"age": 30, "name": "陈加持"}    |
|  3 | {"age": 28, "name": "于浩"}      |
+----+----------------------------------+
3 rows in set (0.00 sec)

mysql> select id,JSON_EXTRACT(context,‘$.name‘) name,JSON_EXTRACT(context,‘$.age‘) age from helei;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | "贺磊"      | 100  |
|  2 | "陈加持"    | 30   |
|  3 | "于浩"      | 28   |
+----+-------------+------+
3 rows in set (0.00 sec)
获取Key-Value

mysql> select id,json_keys(context) from helei;
+----+--------------------+
| id | json_keys(context) |
+----+--------------------+
|  1 | ["age", "name"]    |
|  2 | ["age", "name"]    |
|  3 | ["age", "name"]    |
+----+--------------------+
3 rows in set (0.00 sec)
获取全部Key

mysql> update helei set context=JSON_INSERT(context,‘$.name‘,"贺磊",‘$.address‘,‘beijing‘)where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+------------------------------------------------------+
| id | context                                              |
+----+------------------------------------------------------+
|  1 | {"age": 100, "name": "贺磊", "address": "beijing"}   |
|  2 | {"age": 30, "name": "陈加持"}                        |
|  3 | {"age": 28, "name": "于浩"}                          |
+----+------------------------------------------------------+
3 rows in set (0.00 sec)
增加Key-Value

mysql> update helei set context=JSON_SET(context,‘$.name‘,"高穷帅")where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+---------------------------------------------------------+
| id | context                                                 |
+----+---------------------------------------------------------+
|  1 | {"age": 100, "name": "高穷帅", "address": "beijing"}    |
|  2 | {"age": 30, "name": "陈加持"}                           |
|  3 | {"age": 28, "name": "于浩"}                             |
+----+---------------------------------------------------------+
3 rows in set (0.00 sec)
变更key-value

mysql> update helei set context=JSON_REMOVE(context,‘$.name‘) where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+------------------------------------+
| id | context                            |
+----+------------------------------------+
|  1 | {"age": 100, "address": "beijing"} |
|  2 | {"age": 30, "name": "陈加持"}      |
|  3 | {"age": 28, "name": "于浩"}        |
+----+------------------------------------+
3 rows in set (0.00 sec)
删除Key-Value

JSON格式存储BLOB的测试

Part1:Dynamic Columns处理方式的异同

①MySQL5.7的动态列JSON格式存储

mysql> insert into helei_blob values(1,‘{"name":"贺磊","age":100}‘),(2,‘{"name":"陈加持","age":30}‘),(3,‘{"name":"于浩","age":28}‘);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from helei_blob;
+----+-------------------------------+
| id | blob_col                      |
+----+-------------------------------+
|  1 | {"name":"贺磊","age":100}     |
|  2 | {"name":"陈加持","age":30}    |
|  3 | {"name":"于浩","age":28}      |
+----+-------------------------------+
3 rows in set (0.00 sec)


②MariaDB的动态列JSON格式存储

MariaDB [helei]> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘json default null,primary key(id))‘ at line 1
可以看到MariaDB并不能直接存储JSON类型。

MariaDB [helei]> show create table helei_blob\G;
*************************** 1. row ***************************
       Table: helei_blob
Create Table: CREATE TABLE `helei_blob` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `blob_col` blob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: No query specified

MariaDB [helei]> insert into helei_blob values(5,column_create(‘color‘,‘blue‘,‘size‘,‘XL‘));
Query OK, 1 row affected (0.01 sec)

MariaDB [helei]> select * from helei_blob;
+----+--------------------------------+
| id | blob_col                       |
+----+--------------------------------+
|  1 | {"name":"贺磊","age":100}      |
|  2 | {"name":"陈加持","age":30}     |
|  3 | {"name":"于浩","age":28}       |
|  5 |  	     3 sizecolor!XL!blue |
+----+--------------------------------+
4 rows in set (0.00 sec)
直接查询是乱码需用以下函数查询

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id =5;
+----+------------------------------+
| id | column_json(blob_col)        |
+----+------------------------------+
|  5 | {"size":"XL","color":"blue"} |
+----+------------------------------+
1 row in set (0.00 sec)

MariaDB [helei]> select id,column_list(blob_col) from helei_blob where id =5;
+----+-----------------------+
| id | column_list(blob_col) |
+----+-----------------------+
|  5 | `size`,`color`        |
+----+-----------------------+
1 row in set (0.00 sec)
获取全部Key

MariaDB [helei]> select id,column_get(blob_col,‘color‘ as char) as color from helei_blob where id =5;
+----+-------+
| id | color |
+----+-------+
|  5 | blue  |
+----+-------+
1 row in set (0.00 sec)
获取Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,‘sex‘,‘man‘) where id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+------------------------------------------+
| id | column_json(blob_col)                    |
+----+------------------------------------------+
|  5 | {"sex":"man","size":"XL","color":"blue"} |
+----+------------------------------------------+
1 row in set (0.00 sec)
增加Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,‘color‘,‘black‘) where id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+-------------------------------------------+
| id | column_json(blob_col)                     |
+----+-------------------------------------------+
|  5 | {"sex":"man","size":"XL","color":"black"} |
+----+-------------------------------------------+
1 row in set (0.00 sec)
更改Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_delete(blob_col,‘sex‘,‘man‘) where id=5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+-------------------------------+
| id | column_json(blob_col)         |
+----+-------------------------------+
|  5 | {"size":"XL","color":"black"} |
+----+-------------------------------+
1 row in set (0.00 sec)
删除Key-Value


——总结——

虽然MySQL5.7和MariaDB10.0/10.1版本对于JSON的支持是比较完整的,不过MongoDB的Sharding功能更加好用,个人更倾向于MongoDB。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

时间: 2024-10-07 06:31:46

10分钟了解MySQL5.7对原生JSON的支持与用法的相关文章

Mysql5.7.9原生JSON格式支持

创建表 create table news (uid int auto_increment, data json, primary key(uid))engine innodb; 插入数据 insert into news values (NULL,'{"name":"tester","mail":"[email protected]","address":"Shangahai"}')

MySQL 5.7原生JSON格式支持

在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较.其实早先MariaDB也有对非结构化的数据进行存储的方案,称为dynamic column,但是方案是通过BLOB类型的方式来存储.这样导致的问题是查询性能不高,不能有效建立索引,与一些文档数据库对比,优势并不大,故在社区的反应其实比较一般.当然,MariaDB的dynamic column功能还不仅限于非结构化数据的存储,但不在本文进行展开. MySQL 5.7.7 labs版本开始InnoDB存储引擎已

10 分钟实现一个自己的服务器监控器

需求 最近需要给自己的服务器添加监控器,目的是监控服务器的内存.CPU.磁盘占用率,资源占用率过高的话能给自己发个提醒,当前主流的平台一般会提供邮件.短息.甚至会提供微信提醒,不过这类提醒包含的噪音太多了(夹杂着各种无关的社交信息),我只是单纯的需要接收到服务器的预警.由于服务器环境并不复杂,所以不考虑主流的与监控平台(毕竟搭建起来还是挺复杂的). 选择产品 有很多产品支持 incoming(就是通过调用应用提供的 API 把我们自定义的消息转发送该应用),我打算使用 JBox ,因为它提供了

5分钟了解MySQL5.7对in用法有什么黑科技

MySQL5.7对in用法有什么黑科技 构建测试环境 Part1:创建测试数据库 [[email protected] ~]# mysql -uroot -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.15-log MySQL Community Server (GPL) Copyright

10分钟入门opengl投影变换推导(内含mathjax公式)

*/ pre code { display: block; padding: 0.5em; color: #333; background: #f8f8ff } pre .comment, pre .template_comment, pre .diff .header, pre .javadoc { color: #998; font-style: italic } pre .keyword, pre .css .rule .keyword, pre .winutils, pre .javas

MySQL5.7中使用JSON(一)

因为项目需要,存储字段存储成了JSON格式,在项目中是将查询出来的值通过jackson转成相应的bean进行处理的,觉得不够简单方便. 偶然下,知道了MYSQL5.7原生支持SQL,今天一回来就折腾安装了MYSQL5.7,所以才出现了上篇安装绿色版MYSQL的博文,废话不多说,研究了1个小时的MySQL的JSON的支持.以下是一些粗浅的心得. 一.创建表 CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `info` jso

10分钟学会MySQL基础教程

10分钟学会MySQL基础操作 1分钟安装 Part1:写在最前 MySQL安装的方式有三种: ①rpm包安装 ②二进制包安装 ③源码安装 这里我们推荐二进制包安装,无论从安装速度还是用于生产库安装环境来说,都是没问题的.现在生产库一般采用MySQL5.6,测试库采用MySQL5.7. MySQL5.6安装看这里 http://suifu.blog.51cto.com/9167728/1846671 MySQL5.7安装看这里 http://suifu.blog.51cto.com/916772

AliOS Things+阿里云 10分钟搭建智慧农业解决方案

摘要: AliOS Things+阿里云 10分钟搭建智慧农业解决方案 1.1 样品介绍 在工业.农业物联网布线场景中以MODBUS类型为主,样品提供MODBUS类型传感器硬件和软件快速接入方案,并将传感器数据上传到阿里云物联网平台,在云端table store数据库存储,在datav数据大屏上可视化展示. AliOS Things+阿里云 10分钟搭建智慧农业解决方案1.1 样品介绍在工业.农业物联网布线场景中以MODBUS类型为主,样品提供MODBUS类型传感器硬件和软件快速接入方案,并将传

10分钟教你拥有可编程QQ机器人

10分钟教你拥有可编程QQ机器人 --酷Q Air教程 --BY dudujerry 要想阅读本篇教程,读者需要基本的C++知识以及Visual Studio 2010/2015/2017 首先,需要从官方网站下载软件 https://cqp.cc/t/23253 .下载后从"下载"/"Download"文件夹中找到其压缩包.解压. 然后,我们从Github中下载酷Q的SDK. https://github.com/CoolQ/cqsdk-vc 解压发现.sln,是