一 写在前面

本系列文章基于 5.7.12 版本讲述MySQL的新特性。从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能。同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化。本文将重点介绍新版本对JSON格式的支持。

5.1  支持JSON

从MySQL 5.7.8 开始,MySQL支持原生的JSON格式,即有独立的json类型,用于存放 json格式的数据。JSON 格式的数据并不是以string格式存储于数据库而是以内部的binary 格式,以便于快速的定位到json 格式中值。

在插入和更新操作时MySQL会对JSON 类型做校验,已检查数据是否符合json格式,如果不符合则报错。同时5.7.8 版本提供了四种JSON相关的函数,从而不用遍历全部数据。

a 创建: JSON_ARRAY(), JSON_MERGE(), JSON_OBJECT()

b 修改: JSON_APPEND(), JSON_ARRAY_APPEND(), JSON_ARRAY_INSERT(), JSON_INSERT(), JSON_QUOTE(), JSON_REMOVE(), JSON_REPLACE(), JSON_SET(), and JSON_UNQUOTE()

c 查询: JSON_CONTAINS(), JSON_CONTAINS_PATH(), JSON_EXTRACT(), JSON_KEYS(),JSON_SEARCH().

d 属性: JSON_DEPTH(), JSON_LENGTH(), JSON_TYPE() JSON_VALID().

我们通过简单的例子来对json有一定的认识。

创建

mysql> SELECT JSON_ARRAY('id', 1, 'name', 'dba@youzan');

+-------------------------------------------+

| JSON_ARRAY('id', 1, 'name', 'dba@youzan') |

+-------------------------------------------+

| ["id", 1, "name", "dba@youzan"] |

+-------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_OBJECT('id', 1, 'name', 'dba@youzan');

+--------------------------------------------+

| JSON_OBJECT('id', 1, 'name', 'dba@youzan') |

+--------------------------------------------+

| {"id": 1, "name": "dba@youzan"} |

+--------------------------------------------+

1 row in set (0.00 sec)

初始化

create table json_test (

id int(11) PRIMARY KEY NOT NULL auto_increment,

data json

) engine=innodb default charset=utf8;

insert into json_test values (1,'{ "DBA": [ { "firstName": "yi", "lastName":"yang", "email": "dba@youzan.com" }],

"SA": [{ "firstName": "you", "lastName": "zan", "email": "sa@youzan.com" }],

"PE": [{ "firstName": "xiao", "lastName": "xiao", "email": "pe@youzan.com" }] }')

修改

mysql> select * from json_test \G

*************************** 1. row ***************************

id: 1

data: {"PE": [{"email": "pe@youzan.com", "lastName": "xiao", "firstName": "xiao"}], "SA": [{"email": "sa@youzan.com", "lastName": "zan", "firstName": "you"}], "DBA": [{"email": "dba@youzan.com", "lastName": "yang", "firstName": "yi"}]}

1 row in set (0.00 sec)

mysql> update json_test set data=json_array_append(data,'$.DBA','{"email": "dba@youzan.com", "lastName": "yang", "firstName": "qilong"}') where id=1;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from json_test \G

*************************** 1. row ***************************

id: 1

data: {"PE": [{"email": "pe@youzan.com", "lastName": "xiao", "firstName": "xiao"}], "SA": [{"email": "sa@youzan.com", "lastName": "zan", "firstName": "you"}], "DBA": [{"email": "dba@youzan.com", "lastName": "yang", "firstName": "yi"}, "{\"email\": \"dba@youzan.com\", \"lastName\": \"yang\", \"firstName\": \"qilong\"}"]}

1 row in set (0.00 sec)

删除

mysql> update json_test set data=json_remove(data,'$.DBA[1]') where id=1;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from json_test \G

*************************** 1. row ***************************

id: 1

data: {"PE": [{"email": "pe@youzan.com", "lastName": "xiao", "firstName": "xiao"}], "SA": [{"email": "sa@youzan.com", "lastName": "zan", "firstName": "you"}], "DBA": [{"email": "dba@youzan.com", "lastName": "yang", "firstName": "yi"}]}

1 row in set (0.00 sec)

-- 删除语句

update history_tab_sum set data=json_remove(data,'$."2017.11.28"') ;

-- 更新

-- update history_tab_sum set total=json_replace(total,'$."2017-11-28"',id);

-- 插入:

UPDATE history_tab_sum set data=JSON_MERGE(data,'{"2017-11-28":3344}')  where id=10283;

-- append

update history_tab_sum set data=json_array_append(data,'$."2017-11-28"',id) where id=10283;

查看 json的key

mysql> SELECT id,json_keys(data) as "keys" FROM json_test;

+----+---------------------+

| id | keys |

+----+---------------------+

| 1 | ["PE", "SA", "DBA"] |

+----+---------------------+

1 row in set (0.00 sec)

查看DBA对应的值

mysql> SELECT id,json_extract(data,'$.DBA[0]') from json_test;

+----+--------------------------------------------------------------------+

| id | json_extract(data,'$.DBA[0]')                                      |

+----+--------------------------------------------------------------------+

| 1 | {"email": "dba@youzan.com", "lastName": "yang", "firstName": "yi"}  |

+----+--------------------------------------------------------------------+

1 row in set (0.00 sec)

其他函数的用法请感兴趣的读者朋友自行参考《官方文档》

MySQL 5.7 版本提供的json格式以及对应的操作函数极丰富了MySQL的存储格式,可以在一定程度上和Mongodb和pg竞争,对于经常使用MySQL varchar 存储json的业务是一个福音。同时再强调一下对于OLTP业务的表结构设计 尽可能的避免大字段存储。一来是减少不必要的查询带来的IO,带宽,内存方面的影响 二来是 避免因为表大小太大导致的ddl 时间成本增加系统风险。

5.2 sys schema

MySQL 5.7 版本新增了sys 数据库,该库通过视图的形式把information_schema 和performance_schema结合起来,查询出更加令人容易理解的数据,帮助DBA快速获取数据库系统的各种纬度的元数据信息,帮助DBA和开发快速定位性能瓶颈。详细的信息请参考《官方文档》,这里给两个例子能直观的了解sys 功能的强大。

mysql> select * from sys.schema_table_statistics limit 2\G

*************************** 1. row ***************************

table_schema: yang

table_name: json_test

total_latency: 1.81 ms

rows_fetched: 21

fetch_latency: 1.45 ms

rows_inserted: 2

insert_latency: 192.67 us

rows_updated: 2

update_latency: 166.94 us

rows_deleted: 0

delete_latency: 0 ps

io_read_requests: 54

io_read: 4.21 KiB

io_read_latency: 289.37 us

io_write_requests: 43

io_write: 388.53 KiB

io_write_latency: 703.51 us

io_misc_requests: 75

io_misc_latency: 40.02 ms

##直接查看未使用过的索引 ,方便吗?

mysql> SELECT * FROM schema_unused_indexes;

+---------------+-------------+------------+

| object_schema | object_name | index_name |

+---------------+-------------+------------+

| yang          | t           | idx_a |

| yang          | yy          | idx_nm |

+---------------+-------------+------------+

2 rows in set (0.00 sec)

参考文章[1] 《MySQL 5.7 官方文档》

[2] 《MySQL 5.7 初探》

[3] 《MySQL 5.7新特性之一》

[4] 《》

[5] 《》

[6] 《MySQL 5.7新特性之四》

mysql5.7 json特性_【Mysql】Mysql5.7新特性之-json存储相关推荐

  1. c++11新特性_【C++11新特性】 C++11智能指针之weak_ptr

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr. 在学习 weak_ptr 之前最好对 shared_ptr 有所了解.如果你还不知道 shared_ptr 是何物,可以 ...

  2. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  3. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  4. ES11新特性_私有属性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记061

    然后我们再来看es11的,私有属性去看看 可以看到我们这里去声明一个类,在类中,我们声明公有属性直接写就可以 对于私有属性需要在属性前加上#,然后我们写一个构造方法, 注意构造方法中对于私有属性的赋值 ...

  5. c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引

    原创作者:杨涛涛 我们今天来介绍下 MySQL 8.0 引入的新特性:倒序索引. MySQL长期以来对索引的建立只允许正向asc存储,就算建立了desc,也是忽略掉. 比如对于以下的查询,无法发挥索引 ...

  6. 【MySQL】MySQL 5.7 新特性整理

    MySQL 5.7 新特性有很多,有以下这些 一.InnoDB变更 默认存储引擎改为InnoDB:MySQL 5.7将默认存储引擎改为InnoDB,以推动其成为事实标准.这意味着任何未指定存储引擎的表 ...

  7. MySQL 8.0新特性--CTE Recurive(二)

    上一篇介绍了CTE的基本用法,参考MySQL 8.0新特性--CTE(一),本篇再来介绍一下CTE Recurive递归. 1.什么是CTE Recurive? A recursive common ...

  8. mysql8.0创建属性,MySQL 8.0新特性 — 管理端口的使用简介

    前言 下面这个报错,相信大多数童鞋都遇见过:那么碰到这个问题,我们应该怎么办呢?在MySQL 5.7及之前版本,出现"too many connection"报错,超级用户root ...

  9. mysql3819错误,MySQL 8.0新特性 ― 检查性约束的使用简介

    前言 在MySQL 8.0版本中,引入了一个非常有用的新特性 ― 检查性约束,它可以提高对非法或不合理数据写入的控制能力:接下来我们就来详细了解一下. 检查性约束 创建.删除与查看 (1)可以在建表时 ...

  10. MySQL 5.7 新特性解读

    2015年10月22日,MySQL发布5.7.9稳定版,虽然MySQL官方手册里已经有很多关于MySQL 5.7新特性的介绍,在这里,还是让我们一起看看在MySQL 5.7里有哪些值得我们关注的新特性 ...

最新文章

  1. 员工未回复群消息被罚200元,企业:符合公司规章制度
  2. 基于Ionic的项目解决跨域问题
  3. 离散数学 消解算法判断合取范式的可满足性
  4. 2020-12-11 Python中的 if __name__ == “__main__“
  5. CodeForces 811B Vladik and Complicated Book
  6. CCNET配置文件配置工具
  7. 初一级练习题(2019.3.8)
  8. 简单的基准测试:不可变集合VS持久集合
  9. 查php源码授权后门,PHP授权系统+支持盗版入库+一键黑页后门注入+卡密授权
  10. [中山市选]杀人游戏 (Tarjan缩点)
  11. vue 写bean_vue+jsp+删除一个bean
  12. linux智能灌溉流程,农田自动灌溉系统及灌溉方法与流程
  13. 优酷基于 Pipeline 的播放器开放式架构设计与实践
  14. 深入解读Linux内存管理系列(4)——Memblock管理机制
  15. Ynote源码涉及功能解剖
  16. origin 快捷键
  17. 【C语言】数组(详细讲解+源码展示)
  18. MIMO系列之分集与复用
  19. 一个困扰程序员很多年的问题:微服务领域SpringCloud这么火,为何还要学习SpringCloud Alibaba?
  20. html5附近餐厅,【天津】必吃的5家餐厅8种美食,让你的小长假周边游更完美!...

热门文章

  1. http缓存协议详解
  2. 如何改变maven项目的pom文件中默认的主代码目录 以及默认的测试代码目录?
  3. [轉].NET项目是否有必要升级到.NET 3.5 + VS 2008
  4. 1、环境搭建、Helloworld
  5. 华为交换机端口不配置access_华为交换机如何配置端口组?华为交换机端口组-百度经验...
  6. linux修改私钥的密码,linux使用密钥+密码登录ssh(centos7)
  7. epoch如何设置_Kaggle竞赛硬件如何选择?不差钱、追求速度,那就上TPU吧
  8. php的字符串操作,PHP 字符串操作
  9. 用python做舆情分析系统_如何用Python做舆情时间序列可视化?
  10. dfs时间复杂度_两道有意思的时间复杂度计算