MySQL 实战:如何正确使用 JSON 字段?

一、为什么 MySQL 要引入 JSON 字段?

在互联网业务中,经常会遇到以下情况:

  • 字段属性不固定(如商品属性、用户画像标签等)
  • 结构会随着业务变化而变化,不适合频繁修改表结构
  • 希望兼顾查询能力和灵活性

MySQL 从 5.7 版本开始原生支持 JSON 类型,提供了结构化存储、自动校验、丰富查询函数等能力,用于解决传统 text/varchar 存储 JSON 的不足。


二、JSON 字段有哪些特点?

1. 存储格式是二进制(不是纯文本)

  • MySQL 内部会将 JSON 数据解析为 binary JSON,查询更快。
  • 插入时会进行 语法校验,不是合法 JSON 会报错。

2. 可索引,但有限制

MySQL 给 JSON 字段建立索引有两种方式:

方式 1:生成列(Generated Column)+ 索引

ALTER TABLE user
ADD COLUMN age_int INT GENERATED ALWAYS AS (json_extract(profile, '$.age')) STORED,
ADD INDEX idx_age(age_int);

这是最常见、最稳定的用法。

方式 2:MySQL 8.0 的功能索引(Functional Index)

CREATE INDEX idx_city 
ON user ((json_unquote(json_extract(profile, '$.city'))));

三、JSON 字段常用操作

下面这些是最常用的 JSON 操作函数,建议掌握。

1. 插入/更新 JSON

INSERT INTO user(profile)
VALUES ('{"age": 20, "city": "Beijing"}');

部分修改 JSON(不需要整段覆盖):

UPDATE user
SET profile = JSON_SET(profile, '$.age', 21)
WHERE id = 1;

删除字段:

UPDATE user
SET profile = JSON_REMOVE(profile, '$.city')
WHERE id = 1;

四、如何查询 JSON 字段?

1. 查询某个键

SELECT JSON_EXTRACT(profile, '$.age') AS age
FROM user;

去掉引号的值(更常用):

SELECT JSON_UNQUOTE(JSON_EXTRACT(profile, '$.age')) AS age
FROM user;

2. 条件查询







次阅读

扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论