MySQL的JSON函数是处理JSON数据的高效工具,核心在于JSON_EXTRACT、JSON_SET等函数能直接操作JSON字段,避免传统字符串解析的复杂性。
mysql json 函数 查询方法详解
JSON_EXTRACT:提取JSON值
JSON_EXTRACT在JSON函数中出场率最高,它从JSON文档中按路径提取值,语法是JSON_EXTRACT(json_doc, '$.path'),路径用开头,点号分隔键名,从{"name":"John", "age":30}中拿名字,写JSON_EXTRACT(json_col, '$.name')。
实际操作中,你常把它放在SELECT里,或用在WHERE子句做过滤,筛选年龄大于25的记录:SELECT FROM users WHERE JSON_EXTRACT(profile, '$.age') > 25,返回值是JSON格式,如果不需要引号,用JSON_UNQUOTE包裹。
JSON_SET vs JSON_INSERT vs JSON_REPLACE
这三个函数负责更新JSON字段,但行为不同。JSON_SET插入新值或更新现有值;JSON_INSERT只在键不存在时插入,不覆盖;JSON_REPLACE只更新已有键,选择时,取决于你怕不怕数据被覆盖。
- 场景:更新用户信息时,想添加新字段
email,但不想动name,用JSON_INSERT最安全,JSON_SET会覆盖。 - 对比:
JSON_SET最灵活,但可能误改;适合只改已有键的场景。
JSON_REPLACE
JSON_KEYS和JSON_LENGTH的使用
JSON_KEYS返回JSON对象的所有键列表,帮你看清字段结构。JSON_LENGTH返回JSON数组或对象的长度,常用于验证数据完整性,检查profile对象里键的数量:SELECT JSON_KEYS(profile),或者获取数组items的元素个数:SELECT JSON_LENGTH(json_col, '$.items')。
json mysql 函数 性能优化实践
索引对JSON函数的影响
直接对JSON字段用函数查询,数据库可能走全表扫描,拖慢速度。行业共识认为,用虚拟列加索引是优化JSON查询的靠谱方法,你可以在建表时,为常用JSON路径定义虚拟列,再给这个列加索引。
操作步骤:
- 添加虚拟列:
ALTER TABLE products ADD COLUMN v_price DECIMAL(10,2) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(attributes, '$.price'))) STORED; - 创建索引:
CREATE INDEX idx_v_price ON products(v_price); - 查询时用虚拟列:
SELECT FROM products WHERE v_price BETWEEN 100 AND 200;
这样,查询能从索引走,避免全表扫描。业内专家指出,在数据量大的表上,这个优化能显著提升响应速度。
避免全表扫描
在

WHERE子句里套JSON函数,很难用到常规索引,如果经常按某个JSON键查询,优先建虚拟列,否则,每次查询都扫描整个表,数据量一上来就卡住,另一个技巧是,用JSON_CONTAINS做包含性查询时,尽量配合虚拟列。
mysql json 函数 场景应用
在电商系统中使用
电商系统的商品属性经常变,比如电子产品的屏幕尺寸、服装的尺码,用JSON字段存这些属性,再通过JSON函数查,灵活又省事。
场景:查所有颜色为“红色”的商品。SELECT FROM products WHERE JSON_CONTAINS(attributes, '"red"', '$.color');
查价格区间:SELECT FROM products WHERE JSON_EXTRACT(attributes, '$.price') BETWEEN 50 AND 100;
对比传统关系型存储
传统方法要建属性表,靠多表关联搞,查询写起来复杂,后期改字段也麻烦,JSON函数方法简化了schema,能动态加键,不用改表结构,但性能上,关联查询走索引可能更快,尤其在数据量极大时。多数情况下,数据量不大的业务,用JSON函数更省力。
在其他行业的应用
除了电商,JSON函数在配置管理里也很常见,把不同模块的配置存成JSON字段,通过JSON_SET批量更新,另一个场景是日志存储,用JSON字段存结构化日志,JSON_EXTRACT能快速定位特定字段,这些操作都依赖JSON函数,能减少代码里的解析逻辑。

json mysql 函数 常见问题解答
问题1:如何检查JSON字段是否包含特定键?
解答:用JSON_CONTAINS_PATH函数。SELECT JSON_CONTAINS_PATH(json_col, 'one', '$.name'),返回1表示存在,0表示不存在,另一个选择是JSON_EXISTS,但JSON_CONTAINS_PATH更直观,尤其在检查多个路径时。
问题2:JSON函数在MySQL 5.7和8.0中的差异?
解答:MySQL 8.0新增了JSON_TABLE函数,能把JSON数据转成表格形式,直接关联查询,8.0对JSON函数做了性能优化,比如JSON_EXTRACT在处理多路径时更快,如果你还在用5.7,升级到8.0能获得更多函数和更好的查询效率。
问题3:如何批量更新JSON数据?
解答:用JSON_SET结合UPDATE语句实现。UPDATE users SET profile = JSON_SET(profile, '$.status', 'active') WHERE last_login < '2023-01-01';,如果更新多个键,可以嵌套JSON_SET,批量操作前,建议先备份数据,确保事务安全。
掌握MySQL JSON函数,能让你在数据库操作中更灵活高效,尤其适合处理动态JSON数据,在查询和更新时,合理选择函数并优化索引,是提升性能的关键。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/530083.html