golang,go,博客,开源,编程

mysql 8.0对json的支持

Published on with 0 views and 0 comments

MySQL 8.0 在 MySQL 5.7 的基础上增强了对 JSON 数据类型的支持,引入了更多的功能和改进,特别是在 JSON 数据的查询、索引、操作和性能优化方面。以下是 MySQL 8.0 对 JSON 支持的主要改进和功能:

1. JSON 数据类型增强

在 MySQL 8.0 中,JSON 数据类型的实现更加完整,支持更多的内置函数和操作符。MySQL 8.0 内部仍然使用一种二进制格式(称为 Binary JSON)来存储 JSON 数据,这使得查询性能更加高效。

2. 新增的 JSON 函数和操作符

MySQL 8.0 增加了许多新的函数和操作符,用于更方便和高效地操作 JSON 数据。

2.1 JSON_TABLE 函数

MySQL 8.0 引入了 JSON_TABLE() 函数,可以将 JSON 数据转化为关系型表格形式,从而便于与其他表进行连接操作。这是 MySQL 对 SQL 标准的一个重要扩展,使得 JSON 数据能够像普通表一样进行处理。

SELECT *
FROM JSON_TABLE(
    '[{"id": 1, "name": "John"}, {"id": 2, "name": "Jane"}]',
    '$[*]' COLUMNS (
        id INT PATH '$.id',
        name VARCHAR(50) PATH '$.name'
    )
) AS jt;

该查询将 JSON 数据转换为一个虚拟的表格,可以像普通表一样进行查询。

2.2 JSON 操作符

MySQL 8.0 引入了一些新的 JSON 操作符,使得对 JSON 数据的操作更加简洁和直观。

  • ->->> 操作符: 用于提取 JSON 数据中的值

    • -> 返回一个 JSON 数据类型(包括嵌套对象和数组),如果字段不存在返回 NULL
    • ->> 返回一个普通文本类型,不带引号。

    示例:

    SELECT profile->'$.age' AS age,
           profile->>'$.city' AS city
    FROM users;
    
  • JSON_CONTAINS() 检查 JSON 字段是否包含指定的 JSON 数据。
    示例:

    SELECT * FROM users
    WHERE JSON_CONTAINS(profile, '{"city": "New York"}');
    
  • JSON_ARRAY()JSON_OBJECT() 用于构造 JSON 数据。
    示例:

    SELECT JSON_ARRAY(1, 'a', true) AS array_data;
    SELECT JSON_OBJECT('name', 'John', 'age', 30) AS obj_data;
    

2.3 JSON_MERGE_PATCH()JSON_MERGE_PRESERVE()

这两个函数用于合并 JSON 对象:

  • JSON_MERGE_PATCH():如果两个 JSON 对象有相同的键,后者会覆盖前者的值。
  • JSON_MERGE_PRESERVE():保留原 JSON 对象中的键值对,即使两个 JSON 对象有相同的键,合并时也不会覆盖原始值。

示例:

SELECT JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":3, "c":4}') AS merged_json;
SELECT JSON_MERGE_PRESERVE('{"a":1, "b":2}', '{"b":3, "c":4}') AS preserved_json;

3. JSON 数据的索引优化

MySQL 8.0 通过支持生成 虚拟列 和为其创建索引来提高 JSON 查询的性能。你可以通过提取 JSON 数据中的字段来创建索引,显著提高查询速度。

示例:创建虚拟列并为其创建索引

假设你有一个 JSON 字段 profile,其中包含 agecity 字段。你可以创建一个虚拟列来提取 profile 中的 age 字段,并为其创建索引:

ALTER TABLE users 
ADD COLUMN age INT GENERATED ALWAYS AS (JSON_UNQUOTE(profile->'$.age')) STORED;

CREATE INDEX idx_age ON users(age);

这样,你可以对 JSON 字段 age 进行索引,从而加速基于该字段的查询。

4. JSON 查询优化

MySQL 8.0 对 JSON 查询进行了性能优化,包括对某些常见操作的优化,比如快速访问 JSON 数组的元素。MySQL 8.0 还通过对 索引优化器 的增强,使得 JSON 查询变得更加高效。

5. JSON 数据的格式化和不区分大小写

  • JSON_PRETTY():格式化 JSON 数据,输出结构化的、易于阅读的 JSON。
    示例:
    SELECT JSON_PRETTY(profile) AS pretty_json
    FROM users;
    
  • JSON_UNQUOTE():去除 JSON 字符串中的引号,返回普通文本。
    示例:
    SELECT JSON_UNQUOTE(profile->'$.city') AS city
    FROM users;
    
  • JSON_OBJECT()JSON_ARRAY() 可以创建更灵活的 JSON 数据,支持各种数据类型。

6. 增强的 JSON 数据的集合操作

MySQL 8.0 支持更多关于 JSON 数据的集合操作,例如 JSON_CONTAINS(), JSON_CONTAINS_PATH(), JSON_ARRAY_APPEND() 等,用于更复杂的数据结构查询和更新。

示例:JSON 数组操作

  • JSON_ARRAY_APPEND():向 JSON 数组中追加元素。
    示例:
    UPDATE users
    SET profile = JSON_ARRAY_APPEND(profile, '$.tags', 'new_tag')
    WHERE name = 'John Doe';
    
  • JSON_REMOVE():删除 JSON 数据中的指定键或数组元素。
    示例:
    UPDATE users
    SET profile = JSON_REMOVE(profile, '$.age')
    WHERE name = 'John Doe';
    

7. JSON 的完整性和验证

MySQL 8.0 改进了 JSON 数据的完整性和验证,确保存储的 JSON 数据符合有效的 JSON 格式。如果尝试存储无效的 JSON 字符串,MySQL 会抛出错误。

INSERT INTO users (name, profile)
VALUES ('Alice', '{"age": 30, "city": "Paris"');

上面的查询会因为 JSON 格式不正确而失败。

8. JSON 支持的数据类型

  • MySQL 8.0 的 JSON 数据类型支持多种原生数据类型,如整数、浮点数、字符串、布尔值、数组和对象(键值对)。MySQL 8.0 在解析、存储和查询这些类型时具有更高效的性能。

总结

MySQL 8.0 相比 MySQL 5.7 在 JSON 支持方面进行了显著增强,主要体现在以下几个方面:

  1. 新增了许多 JSON 函数和操作符,如 JSON_TABLEJSON_CONTAINSJSON_ARRAY_APPEND 等,简化了对 JSON 数据的查询和操作。
  2. 优化了 JSON 数据的查询性能,特别是通过支持虚拟列和索引来优化 JSON 字段的访问。
  3. 改进了 JSON 数据的格式化、比较和操作功能,为开发者提供了更灵活的 JSON 处理能力。
  4. 增强了 JSON 数据的验证和完整性,确保存储的 JSON 数据符合正确格式。

MySQL 8.0 的这些新特性使得它更适用于存储和操作复杂的 JSON 数据,尤其是对于那些需要频繁查询和修改 JSON 数据的应用场景(如日志、配置数据、嵌套数据等)。


标题:mysql 8.0对json的支持
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/07/1736216902999.html
联系:scotttu@163.com