使用生成列或函数索引提升MySQL JSON查询性能:通过创建生成列并加索引,或将JSON提取表达式直接建函数索引,使关键字段可被高效查询,避免全表扫描,高频查询字段应“升格”为关系型字段以优化性能。

在 MySQL 中查询 JSON 数据时,如果不加优化,性能可能明显低于传统结构化字段。MySQL 虽然支持 JSON 类型,但原生的 JSON 查询是基于文本解析的,开销较大。要提升 JSON 查询性能,关键在于合理使用生成列(Generated Columns)和索引。
使用生成列 + 普通索引
MySQL 无法直接对 JSON 字段本身创建索引,但可以通过创建虚拟或存储的生成列来提取 JSON 中的关键字段,并为这些列建立索引。
– 假设有一张表 users,其中包含一个 JSON 字段 profile,你想根据用户的年龄(profile->>”$.age”)进行查询。- 可以添加一个生成列来提取 age 值:
ALTER TABLE users ADD COLUMN age INT AS (JSON_UNQUOTE(JSON_EXTRACT(profile, ‘$.age’)));
– 然后为这个生成列创建索引:
CREATE INDEX idx_age ON users(age);
– 后续查询就可以像普通字段一样使用:
SELECT * FROM users WHERE age > 25;
这样查询会走索引,性能大幅提升。
创建函数索引(MySQL 8.0+)
MySQL 8.0 支持在表达式上直接创建索引,无需显式添加生成列。
– 可以为 JSON 提取表达式直接创建索引:
CREATE INDEX idx_profile_age ON users((JSON_UNQUOTE(JSON_EXTRACT(profile, ‘$.age’))));
网龙b2b仿阿里巴巴电子商务平台
本系统经过多次升级改造,系统内核经过多次优化组合,已经具备相对比较方便快捷的个性化定制的特性,用户部署完毕以后,按照自己的运营要求,可实现快速定制会费管理,支持在线缴费和退费功能财富中心,管理会员的诚信度数据单客户多用户登录管理全部信息支持审批和排名不同的会员级别有不同的信息发布权限企业站单独生成,企业自主决定更新企业站信息留言、询价、报价统一管理,分系统查看分类信息参数化管理,支持多样分类信息,
0 查看详情
注意括号:双层括号是语法要求,表示这是一个函数索引。- 创建后,以下查询可以命中索引:
SELECT * FROM users WHERE JSON_UNQUOTE(JSON_EXTRACT(profile, ‘$.age’)) = ’30’;
或者使用更简洁的 ->> 操作符:
SELECT * FROM users WHERE profile->>’$.age’ = 30;
避免全表扫描:慎用 JSON_SEARCH 和深层遍历
如果必须在 JSON 数组或嵌套结构中搜索,尽量避免使用 JSON_SEARCH 或无索引的路径查询,这类操作通常会导致全表扫描。
– 如果经常需要查找某个属性是否存在,考虑将该属性提取到生成列中。- 对于频繁查询的标签、状态类字段,不要长期保留在 JSON 内部。- 尽量扁平化常用查询字段,把高查询频率的 JSON 元素“升格”为关系字段。
合理选择 JSON 使用场景
JSON 适合存储非结构化、变动频繁或读写频率低的配置类数据。如果某个字段几乎每次查询都要用到,就不应放在 JSON 中。
– 高频过滤、排序、连接的字段建议使用常规列类型。- JSON 更适合扩展属性、用户设置、日志详情等辅助信息。- 设计阶段就应评估哪些字段未来可能用于查询,提前规划是否拆出。
基本上就这些。核心思路是:让 JSON 字段中的关键数据“可索引”,通过生成列或函数索引将其暴露给查询优化器。只要合理设计,MySQL 的 JSON 查询也能有不错的性能表现。
以上就是如何在mysql中优化JSON数据查询性能的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/934610.html
微信扫一扫
支付宝扫一扫