0

0

MySQL JSON数据类型使用教程_存储与查询半结构化数据的利器

星夢妙者

星夢妙者

发布时间:2025-08-03 09:06:01

|

831人浏览过

|

来源于php中文网

原创

mysql的json数据类型解决的核心问题是处理半结构化数据,提升数据模型灵活性,适用于字段不固定、结构多变的数据场景。①它允许将完整的json文档存储在单个字段中,支持灵活的插入和更新操作;②提供路径表达式查询功能,如->和->>操作符,实现精准提取和比较;③通过虚拟列和索引优化查询性能,尤其适合基于特定json路径的高频查询;④具备api友好性,减少应用层数据格式转换。然而需注意避免滥用、确保数据验证、控制json大小及合理设计嵌套结构以提升可读性和性能。

MySQL JSON数据类型使用教程_存储与查询半结构化数据的利器

MySQL的JSON数据类型,在我看来,真的是处理半结构化数据的一把利器。它让你能在关系型数据库的严谨框架下,享受到一点NoSQL的自由,存储那些字段不固定、结构多变的数据,同时还能进行高效查询。这大大提升了数据模型的灵活性,也让很多曾经让人头疼的数据存储问题变得简单起来。

MySQL JSON数据类型使用教程_存储与查询半结构化数据的利器

说白了,用JSON类型就是把一段JSON文本直接存进数据库的一个字段里。

创建表的时候,你可以直接指定一个列是

JSON
类型:

MySQL JSON数据类型使用教程_存储与查询半结构化数据的利器
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    details JSON
);

这里

details
字段就是用来放半结构化数据的。

插入数据也挺直接:

MySQL JSON数据类型使用教程_存储与查询半结构化数据的利器
INSERT INTO products (name, details) VALUES
('智能手表', '{"brand": "TechCo", "specs": {"display": "AMOLED", "battery_life": "7 days"}, "features": ["GPS", "Heart Rate Monitor"]}'),
('无线耳机', '{"brand": "AudioPro", "specs": {"driver_size": "10mm", "bluetooth_version": "5.2"}, "color": "Black"}');

你看,

details
字段的内容完全不一样,一个有
features
数组,一个有
color
字段,这就是JSON的魅力。

查询的时候,MySQL提供了一套非常方便的JSON路径表达式。最常用的是

->
->>
操作符。
->
返回的是JSON对象,
->>
返回的是字符串(会自动去引号)。

比如,我想查所有TechCo品牌的商品:

SELECT name, details->'$.brand' AS brand_json, details->>'$.brand' AS brand_text
FROM products
WHERE details->>'$.brand' = 'TechCo';

这里

$.brand
就是JSON路径,表示根对象下的
brand
键。

如果你想获取嵌套深一点的数据,比如智能手表的显示屏类型:

SELECT name, details->>'$.specs.display' AS display_type
FROM products
WHERE name = '智能手表';

路径可以是

$.key.nested_key
或者
$.array_key[index]

更新JSON数据也有一系列函数,比如

JSON_SET
JSON_REPLACE
JSON_REMOVE
。 比如,我想给智能手表添加一个"防水"的特性:

UPDATE products
SET details = JSON_ARRAY_APPEND(details, '$.features', 'Waterproof')
WHERE name = '智能手表';

或者修改无线耳机的颜色:

UPDATE products
SET details = JSON_SET(details, '$.color', 'White')
WHERE name = '无线耳机';

这些函数用起来非常灵活,可以精确地操作JSON内部的任何部分。

还有一些常用的函数,比如

JSON_CONTAINS
可以检查某个值是否存在:

SELECT name FROM products WHERE JSON_CONTAINS(details->'$.features', '"GPS"');

JSON_SEARCH
可以找到某个值的路径:

SELECT JSON_SEARCH(details, 'one', 'AMOLED') FROM products WHERE name = '智能手表';

JSON_OBJECT
JSON_ARRAY
则可以用来构建JSON数据,虽然插入时直接写JSON字符串更常见,但有时候在存储过程中动态构建会用到。

NetShop网店系统
NetShop网店系统

NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces

下载

在我看来,掌握这些基础操作,你就已经拿到了使用MySQL JSON的钥匙了。

为什么在MySQL中使用JSON数据类型?它能解决什么痛点?

在我看来,MySQL的JSON数据类型之所以成为“利器”,主要解决了以下几个核心痛点:

  • 数据模型灵活性与Schema演进的挑战: 传统关系型数据库在面对快速变化的需求时,修改表结构(比如添加新列)往往是个麻烦事,可能需要停机、数据迁移,甚至回滚方案。JSON字段则不然,新属性直接塞进去,老数据不受影响,简直是为敏捷开发量身定制。产品经理今天想加个“特别说明”,明天想加个“用户偏好”,直接往JSON里扔就行,不用动DDL。
  • 半结构化数据的自然存储: 很多时候数据并不是那么规规矩矩的。比如电商的商品属性,不同品类差异巨大;用户行为日志,每次事件的字段可能都不一样。如果硬要用传统列,你可能得建一堆
    nullable
    的列,或者搞EAV(实体-属性-值)模型,那查询起来简直是噩梦。JSON就完美解决了这个问题,一个字段搞定所有变数,数据结构一目了然。
  • 减少表的数量和JOIN操作: 以前为了存储非固定属性,可能要拆分出很多子表,然后通过JOIN来查询。JSON数据类型把相关数据“聚合”在一个字段里,减少了JOIN的次数,理论上可以提升某些查询的性能。当然,这也不是绝对的,具体还得看查询模式。
  • API友好性: 现在很多前后端交互都是JSON格式,直接在数据库里存JSON,可以减少应用层的数据转换开销,让数据流动更顺畅,开发效率也能有所提升。

如何高效查询和索引MySQL中的JSON数据?

高效地查询和索引JSON数据是发挥其潜力的关键,否则它可能成为性能瓶颈。

  • JSON路径表达式的艺术: 刚才提到了

    ->
    ->>
    。熟练运用它们是高效查询的基础。记住
    ->
    返回的是JSON值(可能还是个JSON对象或数组),而
    ->>
    返回的是字符串(会自动去引号)。这在WHERE子句中进行比较时非常关键,比如
    details->>'$.brand' = 'TechCo'
    ,确保比较的是字符串类型。

  • 虚拟列(Virtual Columns)的魔力: 这是MySQL JSON查询优化的杀手锏。JSON字段本身是不能直接创建索引的,因为它是一个大文本块。但是,你可以基于JSON字段的某个路径创建一个“虚拟列”,然后在这个虚拟列上创建索引。

    • 举个例子: 假设我们经常需要根据
      details
      中的
      brand
      来查询商品。
      ALTER TABLE products ADD COLUMN brand_virtual VARCHAR(255) AS (details->>'$.brand');
      CREATE INDEX idx_products_brand ON products (brand_virtual);

      这样,当你执行

      SELECT * FROM products WHERE details->>'$.brand' = 'TechCo';
      时,MySQL优化器可能会自动使用
      idx_products_brand
      这个索引,因为虚拟列的表达式和查询条件匹配。 注意:MySQL 8.0.13及以上版本,如果你的查询条件直接是
      details->>'$.brand'
      ,并且你有一个基于
      details->>'$.brand'
      的虚拟列索引,优化器是能够识别并利用这个索引的。

  • 函数索引的限制与替代: 虽然MySQL不支持直接对

    JSON_EXTRACT()
    等函数的结果创建函数索引,但虚拟列就是一种变相的“函数索引”,它把函数的结果固化在一个列上,从而可以被索引。

  • JSON_CONTAINS与JSON_SEARCH的优化考量: 这些函数在处理复杂查询时非常有用,比如查找JSON数组中是否存在某个值。但它们通常会导致全表扫描,因为它们需要解析整个JSON字符串。如果对性能要求高,并且查询模式固定,还是考虑虚拟列加索引。

使用MySQL JSON数据类型时,有哪些常见的“坑”和最佳实践?

用JSON数据类型确实很爽,但它也不是万能的,有些“坑”和最佳实践需要我们注意。

  • 不是万能药,别滥用: 我见过一些项目,啥都往JSON里塞,结果把JSON字段当成了NoSQL数据库,最后发现查询复杂、性能瓶颈。JSON适合存储半结构化、非固定模式的数据,但对于那些结构稳定、需要频繁精确查询和聚合的字段,还是乖乖用普通列吧。比如,商品名称、价格、库存这种,就应该用VARCHAR、DECIMAL、INT。

  • 数据验证的缺失: MySQL的JSON类型不会帮你验证JSON内容的结构是否符合预期。你存进去什么样,它就存什么样。这意味着你需要在应用层做好数据校验,否则可能存入不合规范的数据,导致后续查询出错。这有点像把脏数据直接塞进一个大口袋,后面找起来就麻烦了。

  • 性能考量: 尽管有虚拟列,但JSON数据的解析和操作仍然比直接操作普通列要慢。特别是当你需要查询JSON内部的深层嵌套数据,或者对大型JSON文档进行频繁修改时,性能可能会成为瓶颈。

  • 可读性和调试难度: 想象一下,一个几百K的JSON字符串堆在一个字段里,人工去阅读和调试简直是噩梦。虽然有工具可以格式化,但在命令行里看还是挺费劲的。

  • JSON大小限制: MySQL的JSON字段存储的是TEXT或BLOB类型,理论上最大可以到4GB,但实际操作中,过大的JSON文档会严重影响性能。通常建议单个JSON文档保持在几十KB到几百KB的量级。

  • 更新操作的原子性: 虽然JSON函数提供了细粒度更新,但如果你在同一事务中对同一个JSON字段进行多次复杂操作,可能会有性能或并发问题。

  • 最佳实践:

    • 混合使用: 将固定、结构化的数据存储在常规列中,将灵活、半结构化的数据存储在JSON列中。这是最常见的,也是最推荐的方式。
    • 合理设计JSON结构: 尽量扁平化,避免过深的嵌套,这有助于提高查询效率和可读性。
    • 利用虚拟列: 对于经常需要查询或排序的JSON路径,务必创建虚拟列并添加

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

663

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

529

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 799人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号