MySQL8.0索引新特性—支持降序索引与支持隐藏索引

MySQL 8.0新增的三种索引方式 MySQL 8.0中,只需要将这个索引先设置为隐藏索引,使查询优化器不再使用这个索引,但是,此时这个索引还是需要MySQL后台进行维护,当确认将这个索引设置为隐藏索引系统不会受到影响时,再将索引彻底删除。灰度发布,就是说创建索引时,首先将索引设置为隐藏索引,通过修改查询优化器的开关,使隐藏索引对查询优化器可见,通过explain对索引进行测试,确认这个索引有效,某些查询可以使用到这个索引,就可以将其设置为可见索引,完成灰度发布的效果。隐藏索引又叫不可见索引,主要应用于索引的 软删除 和 灰度发布。 阅读详情

前言

MySQL中的索引可以为提高我们的查询效率,相比较于低版本, MySQL 8.0中针对索引做了不少的优化,本文主要分享下MySQL8.0中关于索引的两个新特性,这两个新特性都非常好用,希望大家可以在日常的开发中根据实际场景用起来。

支持索引降序排序

降序索引说明

在建立的索引可以指定索引的顺序,命令如下:

ALTER TABLE table_name ADD [UNIQUE] [INDEX | KEY] [index_name] (col_name[length],...) [ASC | DESC] 复制代码
  • ASC表示升序、DESC表示索引降序排序

  • 从MySQL4版本中就开始支持DESC的语法,但是实际上会忽略它,指导MySQL8.x innoDB存储引擎才支持降序排序。

例子:在MySQL5.x中创建DESC降序索引无效

  1. 在MySQL5.7.16中创建降序索引

create table student ( id_ int(10) AUTO_INCREMENT, student_no varchar(50), student_name varchar(200), update_time datetime, primary key (id_), unique index idx_no(student_no desc) ) 复制代码
  • 创建了降序索引idx_no

  1. 我们用show create table student;查看表的信息。

  1. 同样,我们在MySQL8中查看表的信息,如下图:

降序索引好处

你可能疑惑了,那我为什么要设置索引为降序,有什么好处呢?

其实这和我们实际的业务场景息息相关,比如我们的场景中如果存在一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。如果只对单个列进行排序,降序索引的意义不是太大,无论是升序还是降序,升序索引完全可以应付。详细内容请参考文章:www.cnblogs.com/ivictor/p/9…。

那么降序索引的底层数据结构是什么样的呢?下图是基于student表建立的降序索引对应的B+树结构:

  • 页10和页12是对应的数据页,存放数据,其中update_time字段对应的值是降序排序,这也是DESC的体现。

  • 页20是目录页,存放索引,它也是降序排序的。

索引数据结构详细请参考:一步步带你设计MySQL索引数据结构。

支持索引的隐藏

隐藏索引的说明

MySQL 8.0 支持了 Invisible Indexes 隐藏索引 这个特性,可以把某个索引设置为对优化器不可见,生成查询计划时便不使用这个索引了,但这个索引还是被正常维护的,例如表数据变更后还是会更新索引。

我们可以通过在创建索引的时候设置索引的隐藏属性,如下:

ALTER TABLE tablename ADD INDEX indexname (propname [(length)]) INVISIBLE; 复制代码

也可以对已经存在的索引切换显示或者隐藏,语法如下:

ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切换成隐藏索引 ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切换成非隐藏索引 复制代码

隐藏索引的好处

众所周知,索引的维护是需要极大的成本的,数据量越大,建立索引花费的成本也就越大。但是,往往我们在调优的时候有这样的需求,我们想要看看禁用掉这个索引对查询性能的影响,如果在8.0版本以前,都是要删除这个索引,发现这个索引有用的,又要加回来,极大的增加了操作成本。

所以隐藏索引最明显的一个作用类似索引回收站。

例如数据库长时间运行后,会积累很多索引,做数据库优化时,想清理掉没什么用的多余的索引,但可能删除某个索引后,数据库性能下降了,发现这个索引时有用的,就要重新建立。这时候隐藏索引就派上用场了。

总结

本文分享了MySQL8.0中关于索引的两个新特性,一个是支持降序索引,另外一个是支持隐藏索引,他们都是有着非常强的实用价值的。如果本文对你有帮助,请留下一个赞吧。

14.7 降序索引 14.7 降序索引MySQL 4版本开始就已经支持降序索引的语法了,但是直到MySQL 8.x版本才开始真正支持降序索引。本节就对比MySQL 5.7MySQL 8.x中对降序索引的处理来介绍MySQL 8.x中的降序索引特性。 14.7.1 降序索引概述 MySQL 8.x版本中另一项重要的新特性就是真正开始支持降序索引,但是只有MySQL的InnoDB存储引擎... 阅读详情

相关推荐

MySQL 8.x新特性之——优化器索引

MySQL 8.x中新增了三种索引方式,如下所示。 隐藏索引 降序索引 函数索引 一、隐藏索引 1.隐藏索引概述 MySQL 8.0开始支持隐藏索引(invisible index),不可见索引隐藏索引不会被优化器使用,但仍然需要进行维护。 应用场景:软删除、灰度发布。 在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索引删错了,又只能通过创建索引的方式将删除...

冰河的专栏 2322

mysql 降序索引_MySQL8.0中的降序索引

前言相信大家都知道,索引是有序的;不过,在MySQL之前版本中,只支持升序索引,不支持降序索引,这会带来一些问题;在最新的MySQL 8.0版本中,终于引入了降序索引,接下来我们就来看一看。降序索引单列索引(1)查看测试表结构mysql> show create table sbtest1\G*************************** 1. row ***************...

weixin_36431035的博客 1775

MySql降序索引及作用,简要概述

代码:explain select b from a order by bdesc,c,d extra。代码:explain select b from a order by b,c,d。create index idx1 on a(b desc,c desc,d desc) 降序。create index idx1(自定义索引名) on a(b(字段名),c,d) 升序。降序(desc,大到小,mysql 8.0之后支持,之前语法支持,效果不支持)会先按照顺序先a,在b, c 的方式进行排序。...

Miss__King的博客 3572

MySQL索引的创建、删除以及MySQL8.0索引新特性支持降序索引隐藏索引

文章目录1.索引的分类1.1 普通索引1.2 唯一性索引1.3 主键索引1.4 单列索引1.5 多列索引1.6 全文索引1.7 空间索引2.索引的声明使用2.1 创建索引2.1.1 创建表时创建索引2.1.2 创建表时创建索引2.1.3 参数含义2.2 删除索引3.MySQL8.0索引新特性3.1 支持降序索引3.2 隐藏索引3.2.1 隐藏索引的作用3.2.1 隐藏索引的创建3.2.1.1 创建表时创建隐藏索引3.2.1.1 创建表后创建隐藏索引3.2.2 修改索引的可见性3.2.3 注意 1.索引的分

weixin_46245201的博客 2232

MySQL8.0中你不得不知道的索引新特性

MySQL中的索引可以为提高我们的查询效率,相比较于低版本, MySQL 8.0中针对索引做了不少的优化,本文主要分享下MySQL8.0中关于索引的两个新特性,这两个新特性都非常好用,希望大家可以在日常的开发中根据实际场景用起来。本文分享了MySQL8.0中关于索引的两个新特性,一个是支持降序索引,另外一个是支持隐藏索引,他们都是有着非常强的实用价值的。如果本文对你有帮助,请留下一个赞吧。

m0_73311735的博客 440

8. MySQL 索引的创建涉及原则(详解说明)

在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。

weixin_61635597的博客 1244

MySQL安装流程 及 8.05.7区别

MySQL 8.0MySQL 5.7区别及 8.0安装。

. 8407

MySQL8.0概述及新特性

MySQL8.0概述及新特性

小草的博客 5436

MySQL索引优化篇】索引的分类设计原则

索引的分类,mysql8索引新特性索引的设计原则

比尔高特的博客 189

mysql按升序创建索引_MySQL8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引...

MySQL8.0版本带来了3大索引新功能:隐藏索引,降序索引,函数索引,看字面意义,大致也都能猜到那些功能,下面测试实际了解一下。隐藏索引:MySQL 8.0 支持隐藏索引(invisible index),也称为不可见索引隐藏索引不会被优化器使用。主键不能设置为隐藏(包括显式设置或隐式设置)CREATE TABLE `tb_index` (`id` bigint NOT NULL ,`name...

weixin_39756481的博客 220

MySQL 8.0新特性

MySQL 5.7以及早起版本,InnoDB自增列计数器(auto_increment)的值只存储在内存中。将权限授予哪个用户。函数索引MySQL中相当于新增了一个列,这个列会根据指定的函数进行计算结果,然后使用函数索引时,用这个新增的计算列作为索引MySQL 允许所有用户看到系统数据库的名称和某些表的内容,以便他们能够查询关于自己数据库对象的元数据。MySQL8.0.13开始支持索引使用函数(表达式)的值。MySQL8.0开始支持原子DDL操作,其中表相关的原子DDL只支持InnoDB存储引擎。

学习学习学习学习 1709

mysql8.0.30索引创建设计原则

mysql8.0.30索引创建原则

HappyLearnerL的博客 506

Mysql高级——索引创建和使用

MySQL索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。按照物理实现方式,索引可以分为 2 种:聚簇索引和非聚簇索引。按照作用字段个数进行划分,分成单列索引和联合索引。小结:不同的存储引擎支持索引类型也不一样 InnoDB :支持 B-tree、Full-text 等索引,不支持 Hash索引;MyISAM : 支持 B-tree、Full-text 等索引,不支持 Hash 索引

康小庄的博客 4086

groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能

原文链接:https://www.modb.pro/db/22619导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行验证改编,最后总结心得,希望对大家有帮助。MySQL 8.0 版本带来了3大索引新功能:隐藏索引,降序索引,函数索引,看字面意义,大致也都能猜到那些功能,下面测试实际了解一下。隐藏索引MySQL 8.0...

weixin_39856589的博客 106

8章_索引的创建设计原则

MySQL 8.x开始支持 隐藏索引(invisible indexes) ,只需要将待删除的索引设置为隐藏索引,使 查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引), 确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索 引,再删除索引的方式就是软删除。在表中单个字段上创建的索引,单列索引只根据该字段进行索引,单列索引可以是普通索引,也可以是唯一索引,还可以是全文索引,只需要保证该索引只对应一个字段即可。

qq_45027843的博客 1055

MySQL索引之创建

MySQL索引之创建

宋文轩 1741

mysql高级篇 | 尚硅谷 | 第8章_索引的创建设计原则

(1)冗余索引举例:建表语句如下通过索引就可以对name列进行快速搜索,再创建一个专门针对name列的索引就算是一个冗余索引,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。(2)重复索引另一种情况,我们可能会对某个列重复建立索引col2 INT,col1 既是主键、又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就会生成聚簇索引,所以定义的唯一索引和普通索引是重复的,这种情况要避免。

m0_74795952的博客 1075
上一篇: 浅谈线程池的拓容、判断、限速技巧
下一篇: 谈一谈什么是 MySQL 中的 join 查询
Java_LingFeng
博客等级 码龄4年 501粉丝 259原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值