详解MySQL中JSON数据类型用法及与传统JSON字符串对比

 更新时间:2025年07月23日 16:21:15   作者:Microi风闲  
MySQL从 5.7 版本开始引入了 JSON 数据类型,专门用于存储 JSON 格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型用法并与传统JSON字符串对比,希望对大家有所帮助

前言

MySQL从 5.7 版本开始引入了 JSON 数据类型,专门用于存储 JSON 格式的数据。与传统的将 JSON 作为字符串存储在 VARCHARTEXT 字段中相比,JSON 数据类型提供了更好的存储效率和查询性能。

基本用法

-- 创建包含JSON字段的表
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    attributes JSON,
    json_string TEXT
);

-- 插入JSON数据
INSERT INTO products (name, attributes, json_string) VALUES (
    'Laptop',
    '{"brand": "Dell", "specs": {"cpu": "i7", "ram": "16GB"}, "tags": ["electronics", "computer"]}',
    '{"brand": "Dell", "specs": {"cpu": "i7", "ram": "16GB"}, "tags": ["electronics", "computer"]}'
);

JSON数据类型 vs 传统JSON字符串

1. 存储方式

JSON数据类型:以优化的二进制格式存储,解析后的结构

传统JSON字符串:纯文本存储,需要每次使用时解析

2. 查询方式对比

使用LIKE查询传统JSON字符串

-- 查询品牌为Dell的产品(传统JSON字符串方式)
SELECT * FROM products WHERE json_string LIKE '%"brand": "Dell"%';

这种方式的缺点:

  • 无法使用索引
  • 可能产生误匹配(如值中包含相同字符串)
  • 性能差,需要全表扫描

使用JSON函数查询JSON数据类型

-- 查询品牌为Dell的产品(JSON数据类型方式)
SELECT * FROM products WHERE JSON_EXTRACT(attributes, '$.brand') = 'Dell';
-- 或使用箭头语法(MySQL 8.0+)
SELECT * FROM products WHERE attributes->'$.brand' = '"Dell"';

优点:

  • 可以使用生成的列和索引
  • 精确查询,不会误匹配
  • 性能更好

3. 索引支持

JSON字段可以通过生成列添加索引:

-- 为JSON字段的brand属性创建索引
ALTER TABLE products ADD COLUMN brand VARCHAR(50) 
    GENERATED ALWAYS AS (JSON_UNQUOTE(attributes->'$.brand')) STORED;
CREATE INDEX idx_brand ON products(brand);

JSON存储对象和数组的性能考虑

1. 存储对象

{
  "brand": "Dell",
  "specs": {
    "cpu": "i7",
    "ram": "16GB"
  }
}
  • 查询性能:直接访问嵌套属性比传统JSON字符串解析快得多
  • 索引:可以为嵌套属性创建索引(通过生成列)

2. 存储数组

{
  "tags": ["electronics", "computer", "laptop"]
}

查询包含特定元素的数组

SELECT * FROM products WHERE JSON_CONTAINS(attributes->'$.tags', '"electronics"');

性能考虑

  • 数组查询通常比简单属性查询慢
  • 大数组可能影响性能
  • 考虑将频繁查询的数组元素提取到单独的表中

性能对比总结

特性JSON数据类型传统JSON字符串
存储效率
查询性能
索引支持支持不支持
复杂查询能力
嵌套对象访问性能
数组操作性能
数据验证

最佳实践建议

  • 对于需要频繁查询的JSON属性,考虑提取为单独的列并建立索引
  • 避免在JSON中存储过大的数组
  • MySQL 8.0+对JSON支持更好,优先使用新版本
  • 对于简单键值对,考虑使用传统的关系型设计而非JSON
  • 使用JSON_VALID()约束确保数据完整性

JSON数据类型在大多数场景下都比传统JSON字符串存储方式性能更好,特别是在查询和索引支持方面。但对于简单应用或不需要查询JSON内容的情况,传统字符串方式可能更简单。

到此这篇关于详解MySQL中JSON数据类型用法及与传统JSON字符串对比的文章就介绍到这了,更多相关MySQL JSON数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL实现快速删除所有表而不删除数据库的方法

    MySQL实现快速删除所有表而不删除数据库的方法

    这篇文章主要介绍了MySQL实现快速删除所有表而不删除数据库的方法,涉及mysql批量执行语句的相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Mysql配置my.ini文件的简单成功版本

    Mysql配置my.ini文件的简单成功版本

    my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的,下面这篇文章主要给大家介绍了关于Mysql配置my.ini文件的简单成功版本,需要的朋友可以参考下
    2023-04-04
  • mysql 5.7 docker 主从复制架构搭建教程

    mysql 5.7 docker 主从复制架构搭建教程

    这篇文章主要为大家详细介绍了mysql 5.7 docker 主从复制架构搭建教程,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Mysql 中的case-when详解

    Mysql 中的case-when详解

    case-when  是一种 sql 语句中的语法结构,主要用于数据的行列转换,本文给大家介绍Mysql 中的case-when的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • mssql转换mysql的方法小结

    mssql转换mysql的方法小结

    mssql转换mysql的方法小结,需要的朋友可以参考下。
    2011-03-03
  • mysql实现递归查询的方法示例

    mysql实现递归查询的方法示例

    本文主要介绍了mysql实现递归查询的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • linux使用mysqldump+expect+crontab实现mysql周期冷备份思路详解

    linux使用mysqldump+expect+crontab实现mysql周期冷备份思路详解

    这篇文章主要介绍了linux使用mysqldump+expect+crontab实现mysql周期冷备份,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • mysql 8.0.17 安装与使用教程图解

    mysql 8.0.17 安装与使用教程图解

    这篇文章主要介绍了mysql 8.0.17 安装与使用教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • MySQL密码自动过期配置小结

    MySQL密码自动过期配置小结

    在MySQL中,通过设置password_expired和password_lifetime字段,可以实现密码自动过期的功能,本文就详细的介绍一下如何实现,感兴趣的可以了解一下
    2024-09-09
  • MySQL使用innobackupex备份连接服务器失败的解决方法

    MySQL使用innobackupex备份连接服务器失败的解决方法

    这篇文章主要为大家详细介绍了MySQL使用innobackupex备份连接服务器失败的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02

最新评论