MySQL JSON查询与索引详解

 更新时间:2025年11月10日 16:17:47   作者:愤怒的苹果ext  
本文给大家介绍了MySQL JSON查询与索引的相关知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前言

  • 自MySQL 5.7.8开始引入原生JSON支持,可用于存储动态的列。此时如果想要建立索引,要先建立JSON某一列的虚拟列,使用虚拟列查询。从MySQL 8.0.17开始,InnoDB支持多值索引,相比老版本的查询方式就更直接了。

准备

  • 创建一张配置表,建表语句如下。
CREATE TABLE `t_config` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `extras` json DEFAULT NULL COMMENT '扩展列json字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='配置表';
  • 测试数据
INSERT INTO `t_config` (`id`, `extras`) VALUES (1, '{\"color\": \"red\", \"phone\": [\"157\", \"153\"]}');
INSERT INTO `t_config` (`id`, `extras`) VALUES (2, '{\"color\": \"green\", \"phone\": [\"157\", \"154\"]}');
  • 下面就开始介绍虚拟列多值索引查询与索引方式。

虚拟列

测试平台5.7.26

查询

SELECT * FROM `t_config` WHERE extras->'$.color' = 'red';
或
SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');

现在是走全表扫描

下面创建虚拟列和索引

ALTER TABLE `t_config`
ADD COLUMN `v_color` VARCHAR(32) GENERATED ALWAYS AS
(JSON_UNQUOTE(JSON_EXTRACT(`extras`, _utf8mb4'$.color'))) VIRTUAL NULL;
CREATE INDEX idx_v_color on t_config(v_color);

查询就能走索引了

EXPLAIN SELECT * FROM `t_config` WHERE v_color = 'red';

但是数组phone未找到合适的方式查询。

多值索引

测试平台8.0.43

查询(第二条语句不能利用索引)

SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');
 或者
SELECT * FROM `t_config` WHERE extras->'$.color' = 'red';  

当前是全表扫描

EXPLAIN SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');

增加json里 color字段索引

alter table t_config add index json_color( (cast(extras->'$.color' as char(32) array)));

现在就能走索引了

  • 对于数字数组字段,查询方式
  • 要先创建索引,才能查到数据
alter table t_config add index phone( (cast(extras->'$.phone' as unsigned array)) );
 -- 查询phone字段
 SELECT * FROM `t_config` WHERE json_contains(extras->'$.phone' , '157');
-- 查询phone字段, 参数数组
 SELECT * FROM `t_config` WHERE json_contains(extras->'$.phone' , CAST('[157,153]' AS JSON));

能走索引

总结

  • 从执行计划看,虚拟列的索引执行计划更优,但利用多值索引的json_contains查询方式就不需要转换SQL。
  • 数组列:虚拟列暂未找到查询数组的方式。多值索引要先创建才能查到数据。

参考

到此这篇关于MySQL JSON查询与索引的文章就介绍到这了,更多相关mysql json索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql8.0使用PXC实现高可用的示例(Rocky8.0环境)

    mysql8.0使用PXC实现高可用的示例(Rocky8.0环境)

    本文主要介绍了在Rocky8.0环境下搭建MySQL8.0的Percona XtraDB Cluster(PXC)集群,,可以实现数据实时同步、读写分离和高可用性,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • 基于mysql时间处理函数的应用详解

    基于mysql时间处理函数的应用详解

    本篇文章是对mysql时间处理函数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 通过实例分析MySQL中的四种事务隔离级别

    通过实例分析MySQL中的四种事务隔离级别

    SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。下面这篇文章通过实例详细的给大家分析了关于MySQL中的四种事务隔离级别的相关资料,需要的朋友可以参考下。
    2017-08-08
  • mysql记录根据日期字段倒序输出

    mysql记录根据日期字段倒序输出

    这篇文章主要介绍了mysql记录根据日期字段倒序输出 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • MySql数据引擎简介与选择方法

    MySql数据引擎简介与选择方法

    在MySQL 5.1中,MySQL AB引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的MySQL服务器中
    2012-11-11
  • 值得收藏的mysql常用命令集锦

    值得收藏的mysql常用命令集锦

    这篇文章主要为大家整理了mysql常用命令汇总,连接Mysql、修改mysql密码、数据库的创建删除等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • mysql中InnoDB幻读解决方案与机制

    mysql中InnoDB幻读解决方案与机制

    本文主要介绍了mysql中InnoDB幻读解决方案与机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • MySQL中UPDATE语句使用的实例教程

    MySQL中UPDATE语句使用的实例教程

    这篇文章主要介绍了MySQL中UPDATE语句使用的实例教程,包括UPDATE的使用中所容易引起的性能问题的分析,需要的朋友可以参考下
    2015-11-11
  • MySQL中的驱动表与被驱动表及含义

    MySQL中的驱动表与被驱动表及含义

    使用join连接查询时如果有where条件,则MySQL执行器会根据查询条件过滤后的结果自动选择驱动表或被驱动表,这篇文章主要介绍了MySQL的驱动表与被驱动表,需要的朋友可以参考下
    2023-10-10
  • 浅谈MySQL数据库表锁了怎么解锁

    浅谈MySQL数据库表锁了怎么解锁

    在使用 MySQL 数据库时,有时候会发生某个表被锁住的情况,这可能会导致其他用户无法对该表进行读写操作,影响系统的正常运行,本文主要介绍了浅谈MySQL数据库表锁了怎么解锁,感兴趣的可以了解一下
    2023-10-10

最新评论