MySQL JSON类型字段的查找与更新

MySQL 提供了丰富的函数用于 JSON 类型字段的查找与更新,详见官方文档

简单记一下使用方法,使用的mysql版本:5.7.28-log:

创建一个表 t1,basic_info 字段为JSON类型:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `basic_info` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

插入一条数据:

INSERT INTO `t1`(`id`, `basic_info`) VALUES (1, '{\"age\": 9, \"name\": \"小明\", \"class\": 3}');

一、检索 JSON:

1、查找 JSON 中的某个字段:

比如查询 id=1 的 basic_info 中的 name 字段,可以用以下两种方式:

select basic_info->'$.name' from t1 where id =1;
//或者
select JSON_EXTRACT(basic_info, '$.name') from t1 where id =1;

mysql> select basic_info->'$.name' from t1 where id =1;
+----------------------+
| basic_info->'$.name' |
+----------------------+
| "小明"             |
+----------------------+

或者:

mysql> select JSON_EXTRACT(basic_info, '$.name') from t1 where id =1;
+------------------------------------+
| JSON_EXTRACT(basic_info, '$.name') |
+------------------------------------+
| "小明"                           |
+------------------------------------+
1 row in set (0.04 sec)
 

2、根据JSON中的某个字段查询表中记录:

比如查询name为小明的记录:

select * from t1 where basic_info->'$.name' = '小明';
//或者
select * from t1 where JSON_EXTRACT(basic_info,'$.name') = '小明';

检索JSON数据的方法,文档:https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

二、修改 JSON 

修改JSON中字段的方法,文档:https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html

1、修改 JSON 中的某个字段:

比如我们修改 id =1 的 basic_info 中的age为 10 岁:

可以使用JSON_REPLACE() 或者 JSON_SET()  函数:

update t1 set basic_info = JSON_REPLACE(basic_info, '$.age', 10) where id =1;
//或者
update t1 set basic_info = JSON_SET(basic_info, '$.age', 10) where id =1;

2、往 JSON 中插入一个新的字段:

比如往 basic_info 中插入一个性别“gender”字段:

可以使用JSON_INSERT() 或者 JSON_SET()  函数:

update t1 set basic_info = JSON_INSERT(basic_info, '$.gender', '男') where id =1;
//或者
update t1 set basic_info = JSON_SET(basic_info, '$.gender', '男') where id =1;

JSON_SET(),JSON_INSERT() 和JSON_REPLACE() 函数的区别:

  • JSON_SET() 支持替换现有值,并且支持添加不存在的值。
  • JSON_INSERT() 插入值而不替换现有值。
  • JSON_REPLACE() 仅替换现有值。

还有一些其他的函数,详见对应官方文档。

### 优化 MySQL JSON 字段性能的最佳实践 #### 使用索引来加速查询操作 为了提升涉及 JSON 数据类型的查询效率,在适当的情况下可以创建虚拟列并为其建立索引。通过这种方式,可以直接针对这些预计算好的值执行快速查找而无需解析整个 JSON 文档[^1]。 ```sql ALTER TABLE my_table ADD COLUMN title VARCHAR(255) GENERATED ALWAYS AS (json_unquote(json_extract(data, '$.title'))) VIRTUAL; CREATE INDEX idx_title ON my_table(title); ``` #### 减少不必要的 JSON 解析开销 当只需要访问 JSON 对象内的某些特定部分时,应该只提取那些必要的片段而不是加载完整的文档结构。这有助于减少内存占用以及加快处理速度。 ```sql SELECT json_extract(data, '$.author') FROM books WHERE id = 100; ``` #### 预先定义好常用路径表达式 如果应用程序频繁地按照固定的模式来读取或更新 JSON 中的数据项,则可以在表设计阶段就将此类信息固化下来作为存储引擎的一部分。这样做不仅简化了后续的操作逻辑而且也有利于进一步增强检索效能。 ```sql -- 创建一张带有预先指定 JSON 路径的新表 CREATE TABLE articles ( article_id INT PRIMARY KEY, content LONGTEXT NOT NULL, author_name VARCHAR(100) AS (JSON_UNQUOTE(JSON_EXTRACT(content, '$.author.name'))) STORED, publish_date DATE AS (STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(content, '$.publishDate')), '%Y-%m-%d')) STORED ); -- 插入数据时自动填充衍生字段 INSERT INTO articles VALUES (1,'{"author":{"name":"John Doe"},"publishDate":"2023-09-18"}'); ``` #### 合理规划数据库架构以适应业务需求变化 考虑到未来可能存在的扩展性和灵活性要求,在最初构建系统之时就要充分评估各种因素的影响从而做出最优解的选择。对于经常变动的部分考虑采用独立于核心关系型表格之外的方式来管理其生命周期。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值