当前位置: 首页 > news >正文

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。
  • 数组列:虚拟列暂未找到查询数组的方式。多值索引要先创建才能查到数据。

参考

  • https://cloud.tencent.com/developer/article/1843199
  • https://www.bilibili.com/video/BV1WP4y1K7xB/
http://www.dtcms.com/a/589557.html

相关文章:

  • claude code 自定义命令
  • NET_CAPABILITY_VALIDATED 检测android外网是否可用
  • Gin使用
  • SpringAI整合deepseek的一个简单入门案例
  • 突破智能体训练效率瓶颈:Tree Training如何通过共享前缀重用实现3.9倍加速?
  • Java面试题及答案整理( 2025年11月更新版,持续更新...)
  • 定制营销型网站公司色目人
  • 网站普查建设背景网站推广建议
  • 做网站永久嘟嘟浏览器
  • PS1模拟器 DuckStation更新最新版整合 下载即玩 附PS1Bios/游戏/金手指 安卓版+电脑版
  • Java复习事务相关 mysql事务隔离级别 spring事务的传播机制 2025年11月9日
  • 做网站公司排行榜洛阳做网站公司电话
  • 如何发布网站站长是什么职位
  • Vue基本路由
  • 基于springboot的作业管理系统设计与实现
  • Tauri开发手记——1.开发环境
  • 天翼云 ECS 弹性云主机的IP地址无法访问,无法访问 ECS 的网站,解决方案(随手记)
  • 名费网站制作视频教程淘宝代运营公司哪家好
  • 【开题答辩全过程】以 基于springboot美食分享网站为例,包含答辩的问题和答案
  • 福永自适应网站建智能建站系统官网
  • 【FPGA+DSP系列】——MATLAB simulink仿真整流电路
  • (* clock_buffer_type=“NONE“ *)
  • 上海网站建设最佳方案本地wordpress 上传到服务器
  • 消除FFmpeg库的SONAME依赖
  • 网站制作金华公司电话免费培训seo
  • Qt编程Action:Qt的自动反色方案
  • 福田网站建设费用明细国际消息新闻
  • 网站备案失败wordpress 模版标签
  • Linux开发工具(4)
  • 怎么办一个网站wordpress个人中心无法登录