【MySQL进阶之路 | 高级篇】MySQL8.0索引新特性->降序索引与隐藏索引

1. 支持降序索引

降序索引以降序存储键值.虽然在语法上,从MySQL4版本已经支持降序索引的语法了,但实际上该DESC定义是被忽略的.知道MySQL8.x版本才开始真正支持降序索引.(仅限于InnoDB存储引擎).

MySQL在8.0版本前创建的仍然是升序索引,使用时进行反向扫描,大大降低了数据库的效率.在某些场景下,降序索引的意义重大(反向存储,正向扫描,效率高).例如,一个查询需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将避免数据库使用额外的文件排序操作,从而提高性能.

sql 复制代码
CREATE TABLE demo5(
a INT,
b INT,
INDEX demo5_index(a ASC, b DESC)
)

show index from demo5;

2. 隐藏索引

在MySQL5.7以前,只能通过显式的方式删除索引.此时,如果发现删除的索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来.如果数据表的数据量非常大的话,或者数据表本身很大,这种操作会消耗系统过多的资源,操作成本非常高.

从MySQL8.0开始支持隐藏索引.只需要将索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index强制使用索引,优化器也不会使用),确定索引设置为隐藏后系统不受任何响应,就可以彻底删除索引.这种通过将索引设置为隐藏索引,再删除索引的方式就是软删除.

同时,如果你想验证某个索引删除后的查询性能,也可以暂时隐藏该索引.

注意 : 主键不能设置为隐藏索引.当表中没有显式主键时,表中第一个唯一非空索引成为隐式主键,其也不能被设置为隐藏.

索引默认是可见的.可以通过visible,invisible关键字设置索引的可见性.

(1). 创建表时隐藏索引

sql 复制代码
CREATE TABLE demo6(
a INT,
b INT,
INDEX demo6_index(a) INVISIBLE
);

show INDEX FROM demo6;

(2). 建表后,添加隐藏索引

sql 复制代码
ALTER TABLE demo6 
ADD INDEX demo6_index_a(b) invisible;

注:

当索引隐藏后,它的内容仍然跟正常索引一样实时更新的.如果一个索引需要长期被隐藏,可以将其删除,因为索引的存在会影响插入更新删除的性能.

相关推荐
数据库小学妹14 分钟前
MySQL高可用架构选型实战:MHA vs MGR vs InnoDB Cluster原理对比与性能实测
mysql·mgr·mha·架构选型·mysql高可用
ywl4708120871 小时前
Mysql,使用B+树存储的索引增删改查效率(七)
数据库·b树·mysql
喜欢的名字被抢了1 小时前
MongoDB基础入门:从安装到CRUD与索引优化
数据库·mongodb
泰克教育官方账号1 小时前
泰涨知识 | Hive集群环境部署
数据仓库·hive·hadoop
葫芦和十三10 小时前
图解 MongoDB 27|分片策略:范围分片 vs 哈希分片
后端·mongodb·agent
Jane Chiu11 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
我叫黑大帅11 小时前
MySQL 并发插入竞态问题:原子写入实践指南
后端·mysql·面试
全栈前端老曹11 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
我会尽全力 乐观而坚强12 小时前
MySQL零基础入门(二)
数据库·mysql·adb
龙石数据15 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台