简单谈谈MySQL5.7 JSON格式检索

发布时间 - 2026-01-10 22:14:53    点击率:

MySQL5.7版本开始支持JSON格式,在创建表时,可以指定列表的数据类型为JSON,但是如何在JSON格式上创建索引呢??

本人做了一个简单测试。

第一步:建立一个包含JSON类型的表:

CREATE TABLE json_test` (
 id` int (8) NOT NULL AUTO_INCREMENT,
 content` json NOT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第二步:初始化数据

insert into json_test(content) value( '{"name":"zhangsan","age":18}' );
insert into json_test(content) value( '{"name":"lisi","age":19}' );
insert into json_test(content) value( '{"name":"wangwu","age":20}' );

第三步:查询JSON类列的数据

select json_extract(content,  '$.name' )  from json_test  where json_extract(content,  '$.name' )= "zhangsan" ;

通过expain分析改查询语句,发现其走全表扫描

在网上查询资料,得知如果要在JSON列上进行检索,需要对检索的key创建虚拟列,然后再虚拟列上创建索引

第四步:在content列上,对"name"建立虚拟列

ALTER TABLE json_test  ADD name_virtual  varchar (32) GENERATED ALWAYS  AS (json_extract(content,  '$.name' )) VIRTUAL;

第五步:对虚拟列创建索引

CREATE INDEX name_virtual_index  ON json_test(name_virtual);

再次做查询( 注,where条件需要使用虚拟列来进行检索,如果直接用JSON列比较,还是会走全表扫描 )

explain  select json_extract(content,  '$.name' )  from json_test  where name_virtual= "zhangsan" \G

总结:

其实MySQL通过一种空间换时间的做法,类似创建一个触发器,把JSON列上的数据冗余存储到虚拟列上,比较的时候通过走虚拟列的索引,再定位到实际数据。


# MySQL  # 5.7  # JSON  # 详解Mysql中的JSON系列操作函数  # MySQL操作之JSON数据类型操作详解  # mysql全面解析json/数组  # Mysql怎么存储json格式数据详解  # PHP连接MySQL数据库并以json格式输出  # MySQL5.7 JSON类型使用详解  # Mysql如何对json数据进行查询及修改  # MybatisPlus如何处理Mysql的json类型  # Mysql5.7中JSON操作函数使用说明  # mysql 如何使用JSON_EXTRACT() 取json值  # mysql的json处理实现  # 要在  # 然后再  # 建立一个  # 第二步  # 创建一个  # 人做  # 第三步  # 第四步  # 第五步  # 在网上  # 如何在  # KEY  # PRIMARY  # content 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作壁纸教程视频,电脑壁纸网站?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何实现API版本控制_Laravel版本化API设计方案  移动端脚本框架Hammer.js  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在宝塔面板创建新站点?  *服务器网站为何频现安全漏洞?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Java垃圾回收器的方法和原理总结  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何自定义建站之星网站的导航菜单样式?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  高性价比服务器租赁——企业级配置与24小时运维服务  高防服务器如何保障网站安全无虞?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  原生JS获取元素集合的子元素宽度实例  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何在IIS7中新建站点?详细步骤解析  Linux安全能力提升路径_长期防护思维说明【指导】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  nodejs redis 发布订阅机制封装实现方法及实例代码  如何彻底卸载建站之星软件?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  大同网页,大同瑞慈医院官网?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  如何挑选优质建站一级代理提升网站排名?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  如何用狗爹虚拟主机快速搭建网站?  如何快速重置建站主机并恢复默认配置?  如何在Windows环境下新建FTP站点并设置权限?  网易LOFTER官网链接 老福特网页版登录地址  Laravel怎么为数据库表字段添加索引以优化查询  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何制作一个表白网站视频,关于勇敢表白的小标题?  linux写shell需要注意的问题(必看)  Laravel安装步骤详细教程_Laravel环境搭建指南  JS中对数组元素进行增删改移的方法总结  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  JavaScript如何实现路由_前端路由原理是什么  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何快速查询网址的建站时间与历史轨迹?  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何配置和使用缓存?(Redis代码示例)