通俗易懂:MySQL如何支持JSON数据类型?提供一个使用案例。

本文介绍了MySQL5.7.8后的JSON数据类型,包括存储、验证、查询操作(如JSON_EXTRACT,JSON_SET,JSON_REMOVE)以及MySQL8.0的优化(局部更新和JSON索引)。通过实际案例展示了如何在用户表中使用JSON列并结合查询优化器提升性能。
摘要由CSDN通过智能技术生成

MySQL从5.7.8版本开始正式引入了原生的JSON数据类型,用来支持JSON格式数据的存储、查询和操作。MySQL的JSON数据类型提供了以下几个关键特性:

1. 存储

MySQL中的JSON列可以存储符合JSON格式规范的数据,存储的内容会被MySQL转换为内部格式,从而提高存储效率,并且能进行有效的验证确保存储的文档是合法的JSON。

2. 验证

MySQL会对插入到JSON列的数据自动进行格式验证,如果数据不是有效的JSON格式,则会抛出错误,阻止非法数据的插入。

3. 查询

MySQL提供了一系列的JSON函数,使得用户能够方便地查询和操作JSON列中的数据。例如:

- `JSON_EXTRACT(json_column, '$.key')` 可以提取JSON对象中的指定键值。

- `JSON_SET(json_column, '$.key', 'value')` 可以设置或更新JSON对象中的键值。

- `JSON_REMOVE(json_column, '$.key')` 删除JSON对象中的指定键值。

4. 更新优化

MySQL 8.0增强了对JSON类型的优化,允许局部更新,即仅更新JSON文档中的某个部分,不需要替换整个文档。

5. 索引

在MySQL 8.0.17及之后的版本中,InnoDB存储引擎支持在JSON数组的元素上创建多值索引,这大大提高了含有JSON数组列查询性能。

使用案例

假设有一个用户表 `users`,其中有一列 `preferences` 存储用户的个人偏好,采用JSON格式:

CREATE TABLE users (

user_id INT AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(50),

preferences JSON

);

-- 插入带有JSON数据的记录

INSERT INTO users (username, preferences)

VALUES ('Alice', '{"color": "blue", "notifications": ["email", "sms"], "language": "en"}');

-- 查询用户偏好中的颜色

SELECT JSON_EXTRACT(preferences, '$.color') AS favorite_color

FROM users

WHERE user_id = 1;

-- 更新用户偏好

UPDATE users

SET preferences = JSON_SET(preferences, '$.language', 'fr')

WHERE user_id = 1;

-- 删除某一偏好项

UPDATE users

SET preferences = JSON_REMOVE(preferences, '$.notifications[0]')

WHERE user_id = 1;

在这个例子中,`preferences` 列是一个JSON类型,可以存储各种用户偏好设置。通过JSON函数,可以轻松插入、查询和更新这些数据。同时,在满足条件的情况下,还可以利用MySQL提供的索引功能,优化对JSON数据的检索性能。当然,让我们进一步简化并用生活中的例子来说明MySQL查询优化器的工作原理。

假设光头强和熊二在图书馆工作,他们需要帮助读者找到五本特定主题且评分最高的图书。

-

查询优化器

光头强

-

执行计划

查找图书的方法

-

SQL查询

找书任务

情况一

图书馆有电子目录系统(索引),可以根据主题快速定位到相关书籍区域,并且每本书都有详细的评分记录在卡片上(索引包含评分信息)。

光头强可以选择:

方法A:先通过电子目录锁定主题对应的书架,然后逐个查看书上的评分卡片,选出评分最高的五本。

情况二

没有电子目录,只有纸质目录,而且只记录了书名和作者,评分信息不在目录上。

光头强只能选择:

方法B:先查阅纸质目录找到所有该主题的书,然后一本一本翻开阅读书中附带的评分页,对比后选出评分最高的五本。

光头强(查询优化器)会选择他认为最快捷的方式来完成任务。如果有高效的索引可用,他会优先考虑利用索引来减少查找时间(对应于数据库中利用索引进行查询)。若无有效索引,则可能不得不采取全量搜索的方式(对应于数据库中的全表扫描)。

通过这个例子,我们可以更直观地理解查询优化器是如何基于现有资源(索引、统计数据等)来选择最优的执行计划,以便高效地完成查询请求的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值