• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    简单谈谈MySQL5.7 JSON格式检索

    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列上的数据冗余存储到虚拟列上,比较的时候通过走虚拟列的索引,再定位到实际数据。

    您可能感兴趣的文章:
    • MySQL5.7中的JSON基本操作指南
    • MySQL5.7 JSON类型使用详解
    • Mysql5.7中JSON操作函数使用说明
    • mysql5.6及以下版本如何查询数据库里的json
    • 详解Mysql中的JSON系列操作函数
    • MySQL操作之JSON数据类型操作详解
    • MySQL插入json问题
    • mysql(5.6及以下)解析json的方法实例详解
    • mysql5.7 新增的json字段类型用法实例分析
    上一篇:MySQL5.6 数据库主从同步安装与配置详解(Master/Slave)
    下一篇:浅谈MySQL数据库的备份与恢复
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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