MySQL - Json 数据类型

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL - Json 数据类型

简介

在MySQL5.7.8之后开始支持一种可高效获取JSON文本中数据的原生JSON类型,该类型具有以下优点:

  • JSON数据有效性检查:BLOB类型无法在数据库层做这样的约束性检查
  • 查询性能的提升:查询不需要遍历所有字符串才能找到数据
  • 支持索引:通过虚拟列的功能可以对JSON中的部分数据进行索引
  • JSON查询时,传过去的JSON“{}”里的字段可以不分先后顺序

另外,系统对JSON格式做了一些限制:

  • JSON文本的最大长度取决有系统常量:max_allowed_packet。该值仅在服务器进行存储的时候进行限制,在内存中进行计算的时候是允许超过该值的。
  • JSON列不可有默认值
  • JSON列与其他二进制类型列一样是无法创建索引。但是可以从JSON列中所存储的文本中某些表列值进行创建索引。MySQL最优控制器同样在通过JSON表达创建的索引中进行查询。


如何使用

1. 创建表

createtable`test`(
`id`INTAUTO_INCREMENTPRIMARYKEY,
`content`JSON) CHARSET=utf8;

image.png

2. 插入两条数据

INSERTINTOtest (content) VALUES ('{"name": "baidu",
"host": "www.baidu.com"}');INSERTINTOtest (content) VALUES ('{"name": "alibaba",
"host": "www.alibaba.com"}');

image.png

注意:

JSON列存储的必须是JSON格式数据,否则会报错。

ERROR 3140 (22032): Invalid JSON text: "Invalid value." at position 0 in value for column 'test.content'.

3. 查询

这里主要将关于JSON的查询。

对于表中JSON数据的查询,可以根据JSON中的key值进行查询,看下面SQL语句

selectJSON_EXTRACT(content,'$.name'),JSON_EXTRACT(content,'$.host') fromtest;

image.png

selectJSON_EXTRACT(content,'$.name'),JSON_EXTRACT(content,'$.host') fromtestwhereJSON_EXTRACT(content,'$.name') ="baidu";

image.png

JSON函数支持

https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

JSON中虚拟列的使用

对于索引,JSON字段无法对其中的一个key值进行索引,但是虚拟列可以,我们可以建立一个虚拟列和JSON中key值建立联系。


1. 增加虚拟列v_name,v_host


注意:养成加前缀的好习惯, 例如这里使用"v_"来标记该字段是一个虚拟字段,在团队开发时,共同遵守一个约定, 相互配合起来会非常顺利。

ALTERTABLEtestADDCOLUMNv_nameCHAR(10) AS (content->'$.name');
ALTERTABLEtestADDCOLUMNv_hostCHAR(30) AS (content->'$.host');

image.png下面对虚拟列建立索引

altertabletestaddindexvirtual_index(v_name);

然后查看基于v_name的查找的执行计划

explainselectcontentfromtestwherev_name="baidu";

image.png

从结果来看,查找已经走索引了。

上表中字段信息解释

字段名 解释
id 选择标识符
select_type 查询的类型
table 输出结果的表,也就是被查询的表
partions 表示匹配的分区
type 表示表的连接类型
possible_keys 表示查询时,可能使用的索引
key 表示实际使用的索引
key_len 表示字段的长度
ref 列与索引的比较
rows 扫描出的行数(估算的行数)
filtered 按查询条件过滤的行百分比
Extra 执行情况的描述和说明

详细的说明参考这篇博客:https://www.cnblogs.com/tufujie/p/9413852.html

对虚拟列的简介

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


注意:


在更新和插入数据时,不要给虚拟列设定值,否则会引发错误。

ERROR 3105 (HY000): The value specified for generated column 'v_name' in table 'test' is not allowed.


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
37
分享
相关文章
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
82 5
MySQL支持多种数据类型
MySQL支持多种数据类型
205 4
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
656 0
什么是mysql的数据类型?
什么是mysql的数据类型?
82 2
MySQL数据类型
MySQL数据类型
86 2
MySQL与JSON的邂逅:开启大数据分析新纪元
MySQL与JSON的邂逅:开启大数据分析新纪元
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
887 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等