简单谈谈MySQL5.7 JSON格式检索
作者:yangfei001 发布时间:2024-01-22 09:07:03
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列上的数据冗余存储到虚拟列上,比较的时候通过走虚拟列的索引,再定位到实际数据。


猜你喜欢
- 首先恭喜月影,当然希望好书大卖!原文提供了样章下载1.1M,pdf格式的。如果大家想下载可以访问源地址:http://bbs.51js.co
- (一)什么是跨域同源请求就是指协议名、主机名、端口号三者一样跨域请求:是指协议名、主机名、端口号三者有任何一个不一样,而且跨域请求是请求发出
- HTTP格式HTTP GET请求的格式:GET /path HTTP/1.1Header1: Value1Header2: Value2He
- 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。 主键是一个约束(constraint),
- 自动抢课脚本使用手册@danteking dating from 2021.12.7 and last updating at 2021.1
- 滚动图片可以说是做网站经常会遇到的,特别是做企业网站,最常用的像产品展示,图片展示等,滚动的好处是吸引眼球,让人一下就注意到。之前本站发了一
- 这个函数是前几年刚流行小偷程序的时候,偶写来用于小偷程序中截取代码的;可能有些朋友在我以前的代码中看见过了,但没有写用法,现在把调用方法及使
- Python 风格规范(Google)本项目并非 Google 官方项目, 而是由国内程序员凭热情创建和维护。如果你关注的是 Google
- 一、xpath:基本属性定位上一篇文章讲了通过元素的id、name、class这些属性定位的用户,使用xpath方法结合元素属性也可以很准确
- 下表列出了 Microsoft ACCESS 的命令行选项:选项 效果database 打开指定的 Microsoft Access 数据库
- 本文实例讲述了Python3删除排序数组中重复项的方法。分享给大家供大家参考,具体如下:给定一个排序数组,你需要在[原地]删除重复出现的元素
- asp无组件上传VBS编写的大家见的多了,这个是纯javascript实现的上传,原来unicode可以解决读取位置的问题,这次真的是纯JS
- 引言----在实际的web测试工作中,需要配合键盘按键来操作,webdriver的 keys()类提供键盘上所有按键的操作,还可以模拟组合键
- 在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割。关于opencv库的安装可以参考:Python下
- 废话不多说,直接上代码吧!import threadingimport osclass Find(threading.Thread): #搜
- HTTP应答头概述 Web服务器的HTTP
- python3.7 使用pymssql往sqlserver插入数据import pymssqlconn = pymssql.connect(
- 环境:vue 2.9.3; webpack目的:接口的调用跨域方式:1、express中间的使用2、nginx代理3、谷歌浏览器跨域设置--
- 一:简介由paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于使用的是py
- 在本章中,我们将详细讨论对称和非对称密码术.对称密码术在此类型中,加密和解密进程使用相同的密钥.它也被称为秘密密钥加密.对称加密的主要特征如