百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

MySQL8新增的三种索引方式(mysql 新增索引)

qiyuwang 2025-04-09 19:54 6 浏览 0 评论

MySQL 8.x中新增了三种索引方式:隐藏索引、降序索引 及 函数索引。

1. 隐藏索引

隐藏索引又叫不可见索引,主要应用于索引的 软删除 和 灰度发布。

在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索引删错了,又只能通过创建索引的方式将删除的索引添加回来,如果数据库中的数据量非常大,或者表比较大,这种操作的成本非常高。在MySQL 8.0中,只需要将这个索引先设置为隐藏索引,使查询优化器不再使用这个索引,但是,此时这个索引还是需要MySQL后台进行维护,当确认将这个索引设置为隐藏索引系统不会受到影响时,再将索引彻底删除。这就是索引软删除功能。

灰度发布,就是说创建索引时,首先将索引设置为隐藏索引,通过修改查询优化器的开关,使隐藏索引对查询优化器可见,通过explain对索引进行测试,确认这个索引有效,某些查询可以使用到这个索引,就可以将其设置为可见索引,完成灰度发布的效果。

创建隐藏索引具体代码如下(只需要在创建索引的后面加上invisible即可):

create index 索引名称 on 表名称('索引字段名') invisible;

此时创建的索引就是隐藏索引,我们可以查看当前表中索引列表:

show index from 表名称 \G;

\G:是格式化的意思

显示的索引中有一个Visible属性,YES表示这个索引可见,NO表示不可见。接下来我们在使用explain分析,发现刚刚创建的隐藏索引不生效。在灰度发布的场景中我们需要同过explain分析隐藏索引是否对某些SQL有帮助,但是隐藏索引又不生效,怎么办呢?

在MySQL8 中提供了一种新的测试方式,可以通过优化器的一个开关来打开某个设置,使隐藏索引对查询优化器可见。我们可以通过如下代码查看这个开关是否开启:

select @@optimizer_switch \G;

查询结果如下所示:

use_invisible_indexes=off

这个开关默认是off,off表示关闭,ON表示开启。

我们可以通过如下SQL在当前会话中开启和关闭(不影响其他会话进程):

set session optimizer_switch="use_invisible_indexes=on";

现在我们可以通过explain分析隐藏索引是否对某些SQL有帮助。

注意:主键不能设置隐藏索引哦

2. 降序索引

MySQL 8.0开始真正支持降序索引(descending index),并且只有InnoDB存储引擎支持降序索引,只支持BTREE降序索引。MySQL 8.0不再对GROUP BY操作进行隐式排序。

说实话,我个人绝对这个没有什么实际应用场景,一般我们查询数据都需要where条件,故而一般都会优先优化where条件字段的索引问题。不过我们还是来说说具体操作吧!

create table if not exists test(
c1 int, 
c2 int, 
index c1_c2(c1 asc, c2 desc)
);

如上所示,创建表的时候创建了索引 c1_c2 ,并且在索引中指定了c1是升序,c2是降序。

当我们使用如下SQL查询时:

explain select * from test order by c1, c2 desc;

在MySQL5.7中按照c2字段进行降序排序,并没有使用索引。但是在MySQL8中使用索引,并使用了索引的反向扫描。

我们再来看看下面这条SQL:

explain select * from test order by c1, c2 asc;

此时索引就不起作用了,是不是感觉有点鸡肋。如果我们使用了where条件查询,MySQL优化器会使用where条件中的字段优化查询,因此我感觉这个降序索引没有什么作用。

3. 函数索引

在前的版本中,我们的SQL中使用了某个函数(例如:upper,json相关函数),那么就不会走索引查询,为此MySQL8新增了一个函数索引,以此解决函数不走索引的问题。

3.1 创建函数索引,下面以转大写函数为例:

create index 索引名称 on 表名称( ( UPPER( 字段名 ) ) );

3.2 测试函数索引

explain select * from test where upper(c1) = 'ABC'

test是测试表,并且在c1字段上添加了小写转大写的函数索引

分析结果表明:当前SQL使用了函数索引。

3.3 再来看看对json的支持

创建测试表,如下所示:

create table if not exists test(
data json, 
index( (CAST(data->>'$.name' as char(30) ) ) )
);

JSON数据长度不固定,如果直接对JSON数据进行索引,可能会超出索引长度,通常,会只截取JSON数据的一部分进行索引。

CAST()类型转换函数,把数据转化为char(30)类型。使用方式为CAST(数据 as 数据类型)。

data ->> '$.name'表示JSON的运算符

简单的理解为,就是取name节点的值,将其转化为char(30)类型

SQL中使用同一个json函数查询时,依然会使用函数索引进行优化。

如果有什么不对的地方大家可以在我的公众号留言或者加入我们的粉丝交流群。

粉丝交流群可以在公众号查看哦!

相关推荐

# 安装打开 ubuntu-22.04.3-LTS 报错 解决方案

#安装打开ubuntu-22.04.3-LTS报错解决方案WslRegisterDistributionfailedwitherror:0x800701bcError:0x80070...

利用阿里云镜像在ubuntu上安装Docker

简介:...

如何将Ubuntu Kylin(优麒麟)19.10系统升级到20.04版本

UbuntuKylin系统使用一段时间后,有新的版本发布,如何将现有的UbuntuKylin系统升级到最新版本?可以通过下面的方法进行升级。1.先查看相关的UbuntuKylin系统版本情况。使...

Ubuntu 16.10内部代号确认为Yakkety Yak

在正式宣布Ubuntu16.04LTS(XenialXerus)的当天,Canonical创始人MarkShuttleworth还非常开心的在个人微博上宣布Ubuntu下个版本16.10的内...

如何在win11的wsl上装ubuntu(怎么在windows上安装ubuntu)

在Windows11的WSL(WindowsSubsystemforLinux)上安装Ubuntu非常简单。以下是详细的步骤:---...

Win11学院:如何在Windows 11上使用WSL安装Ubuntu

IT之家2月18日消息,科技媒体pureinfotech昨日(2月17日)发布博文,介绍了3中简便的方法,让你轻松在Windows11系统中,使用WindowsSubs...

如何查看Linux的IP地址(如何查看Linux的ip地址)

本头条号每天坚持更新原创干货技术文章,欢迎关注本头条号"Linux学习教程",公众号名称“Linux入门学习教程"。...

怎么看电脑系统?(怎么看电脑系统配置)

要查看电脑的操作系统信息,可以按照以下步骤操作,根据不同的操作系统选择对应的方法:一、Windows系统通过系统属性查看右键点击桌面上的“此电脑”(或“我的电脑”)图标,选择“属性”。在打开的...

如何查询 Linux 内核版本?这些命令一定要会!

Linux内核是操作系统的核心,负责管理硬件资源、调度进程、处理系统调用等关键任务。不同的内核版本可能支持不同的硬件特性、提供新的功能,或者修复了已知的安全漏洞。以下是查询内核版本的几个常见场景:...

深度剖析:Linux下查看系统版本与CPU架构

在Linux系统管理、维护以及软件部署的过程中,精准掌握系统版本和CPU架构是极为关键的基础操作。这些信息不仅有助于我们深入了解系统特性、判断软件兼容性,还能为后续的软件安装、性能优化提供重要依据。接...

504 错误代码解析与应对策略(504错误咋解决)

在互联网的使用过程中,用户偶尔会遭遇各种错误提示,其中504错误代码是较为常见的一种。504错误并非意味着网站被屏蔽,它实际上是指服务器在规定时间内未能从上游服务器获取响应,专业术语称为“Ga...

猎聘APP和官网崩了?回应:正对部分职位整改,临时域名可登录

10月12日,有网友反映猎聘网无法打开,猎聘APP无法登录。截至10月14日,仍有网友不断向猎聘官方微博下反映该情况,而猎聘官方微博未发布相关情况说明,只是在微博内对反映该情况的用户进行回复,“抱歉,...

域名解析的原理是什么?域名解析的流程是怎样的?

域名解析是网站正常运行的关键因素,因此网站管理者了解域名解析的原理和流程对于做好域名管理、解决常见解析问题,保障网站的正常运转十分必要。那么域名解析的原理是什么?域名解析的流程是怎样的?接下来,中科三...

Linux无法解析域名的解决办法(linux 不能解析域名)

如果由于误操作,删除了系统原有的dhcp相关设置就无法正常解析域名。  此时,需要手动修改配置文件:  /etc/resolv.conf  将域名解析服务器手动添加到配置文件中  该文件是DNS域名解...

域名劫持是什么?(域名劫持是什么)

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。说的直白些,域名劫持,就是把互...

取消回复欢迎 发表评论: