欢迎重视MySQL专栏MySQL历险记
强烈建议收藏本导航文【MySQL历险记】MySQL的中心特性汇总

前言

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;查看表的信息。

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

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

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

降序索引优点

你或许疑问了,那我为什么要设置索引为降序,有什么优点呢?

其实这和咱们实践的事务场景休戚相关,比方咱们的场景中假如存在一个查询,需要对多个列进行排序,且次序要求不一致,那么运用降序索引将会避免数据库运用额定的文件排序操作,然后进步功能。假如只对单个列进行排序,降序索引的意义不是太大,无论是升序仍是降序,升序索引完全能够应付。具体内容请参考文章:www.cnblogs.com/ivictor/p/9…。

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

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

  • 页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中关于索引的两个新特性,一个是支撑降序索引,另外一个是支撑躲藏索引,他们都是有着非常强的实用价值的。假如本文对你有协助,请留下一个赞吧。

本文正在参加「金石计划 . 分割6万现金大奖」