1. 介绍
1.1 JSON的重要性
在现代 Web 开发中,数据交换变得日益复杂。JSON(JavaScript 对象表示法)因其轻量级和结构化的格式而被广泛用于数据传输和存储。自 5.7 版起,MySQL 已支持 JSON 数据类型,使得在数据库中直接处理 JSON 数据更加便捷。
1.2 在 MySQL 中使用 JSON
本文详细阐述了 MySQL 中的 JSON,包括基本操作、性能考量以及实用使用技巧。无论你是初学者还是高级用户,都能获得有效使用 MySQL 中 JSON 的必备知识。
2. MySQL 中的 JSON 是什么?
2.1 JSON 基础
JSON 是一种简单的格式,以键值对的形式组织数据。由于其轻量级和易读性,JSON 被广泛用于 Web API 和数据传输。在 MySQL 中,你可以使用 JSON 数据类型直接在数据库中存储和操作 JSON 数据。
2.2 MySQL 中的 JSON 数据类型
MySQL 5.7 引入的 JSON 数据类型所需的磁盘空间与 LONGBLOB 或 LONGTEXT 类似。为确保数据完整性,MySQL 会在插入时验证 JSON 文档,这可以防止无效的 JSON 数据被写入数据库。
2.3 JSON 的常见使用场景
在 MySQL 中使用 JSON 的主要场景包括:
- 存储复杂的数据结构
- 保存未经修改的 API 响应
- 管理结构随时间演进的数据
3. 基本的 MySQL JSON 操作
3.1 创建 JSON 列
要创建用于存储 JSON 数据的列,请按如下方式指定 JSON 数据类型:
CREATE TABLE json_data (
doc JSON
);
3.2 插入 JSON 数据
使用 INSERT 语句插入 JSON 数据,如下所示。MySQL 会在插入时检查数据是否为有效的 JSON 格式,若不是则返回错误。
INSERT INTO json_data(doc) VALUES ('{"a": {"b": ["c", "d"]}, "e": "f"}');
你也可以使用 JSON_OBJECT 函数从键值对生成 JSON 对象。
INSERT INTO json_data(doc) VALUES (JSON_OBJECT('key1', 'value1', 'key2', 'value2'));
3.3 查询 JSON 数据
要检索已插入的 JSON 数据,请使用 JSON_EXTRACT 函数。该函数从 JSON 对象的指定路径中提取数据。
SELECT * FROM json_data WHERE JSON_EXTRACT(doc, '$.e') = 'f';
你也可以使用简写的 -> 运算符。
SELECT * FROM json_data WHERE doc->'$.e' = 'f';
3.4 更新 JSON 数据
要对 JSON 数据进行部分更新,请使用 JSON_SET 函数。该函数更新指定路径并返回一个新的 JSON 对象。
UPDATE json_data SET doc = JSON_SET(doc, '$.a.b[0]', 'new_value');
4. 性能考虑
4.1 插入性能
在向 MySQL JSON 列插入数据时,TEXT 类型和 JSON 类型的性能差异很小。运行时测试表明,使用 JSON 类型插入 50,000 条记录所需时间与使用 TEXT 类型大致相同。
4.2 更新性能
在更新 JSON 数据时,使用 JSON_SET 可以实现高效的部分更新。它不需要覆盖整个文档,只更新特定字段,从而提升性能。即使对 50,000 条记录进行部分更新,JSON_SET 也能高效执行。

5. 在 MySQL 中使用 JSON 的最佳实践
5.1 何时适当地使用 JSON
JSON 适合存储复杂的数据结构和结构随时间演进的数据。然而,对于高度结构化的数据,使用标准的关系表通常更为高效。
5.2 为 JSON 数据建立索引
在 MySQL 中,你可以通过使用虚拟列(Virtual Columns)在 JSON 列上创建索引。这使得在处理 JSON 数据时能够提升查询性能。
ALTER TABLE json_data
ADD COLUMN e_value VARCHAR(255) AS (doc->'$.e'),
ADD INDEX (e_value);
5.3 避免常见陷阱
- 避免过度使用 JSON 列,并充分利用关系型数据库的优势。
- 配置适当的索引以确保查询高效。
- 防止 JSON 数据过大,并在必要时进行数据规范化。
6. MySQL 中的高级 JSON 函数
6.1 其他 JSON 函数
MySQL 提供了许多用于操作 JSON 数据的函数。例如,你可以使用 JSON_APPEND 向 JSON 数组追加新数据,或使用 JSON_REMOVE 删除特定字段。
-- Append data
UPDATE json_data SET doc = JSON_APPEND(doc, '$.a.b', 'new_element');
-- Remove data
UPDATE json_data SET doc = JSON_REMOVE(doc, '$.a.b[0]');
6.2 将 JSON 与 SQL 函数结合使用
JSON 函数可以与传统的 SQL 函数结合,以构建更复杂的查询。例如,你可以在 GROUP BY 或 ORDER BY 子句中使用 JSON 数据。
SELECT JSON_EXTRACT(doc, '$.e') AS e_value, COUNT(*)
FROM json_data
GROUP BY e_value;
7. 结论
在本文中,我们涵盖了从 MySQL 基础 JSON 操作到高级功能的全部内容。通过利用 MySQL 的 JSON 特性,你可以轻松在数据库中存储和操作复杂的数据结构。运用本文讨论的性能考虑因素和最佳实践,以实现更高效的数据管理。


