MySQL 8.0-索引- 不可见索引(invisible indexes)

概述

MySQL 8.0引入了不可见索引(invisible index),这个在实际工作用还是用的到的,我觉得可以了解下。

在介绍不可见索引之前,我先来看下invisible index是个什么或者定义。

我们依然使用拆开来看,然后再把拆出来的词放到MySQL上下文中去看。
不可见索引:

  1. 不可见:这个概念的关键点就是这个不可见。那对谁不可见?对程序员吗?肯定不是,我们新建了一个索引MySQL对我们不可见我们去哪儿找,怎么修改删除哇。 MySQL官方说是对优化器不可见。
  2. 索引:索引大家都知道是个什么东西,目的是用于快速查找到数据(但是具体要看你怎么用)

定义

好了,那我们可以对不可见索引下定义了。
不可见索引是MySQL 8.0引入的一个索引开关,主要是用来控制优化器在进行SQL优化时是否使用该索引,如果对索引设置了不可见,那么SQL优化器就不会使用这个索引。

也就是说,这个索引对SQL优化器透明或者SQL优化器眼瞎看不到它。

使用场景

搞清楚不可见索引是个什么东西以后,我们就可以考虑怎么在实际项目中用它了。

在说什么场景应用之前,我们先考虑一下我们关于CUD索引的痛点。

  1. 要不要新建一个索引来加速某个或者某些查询?如何来评估新建的索引一定会加速查询?
  2. 要不要删除某个索引,为什么要删除它?怎么来评估删除它以后对业务的影响?删除它时会对业务造成什么影响?
  3. 要不要修改一个索引,把这个索引修改为单字段索引或者组合索引?为什么?

这次我们主要会回答第2个问题。

第2个问题是针对“无用”索引的一个处理。

业务上没有用的查询MySQL也会维护它,因为MySQL也不知道它是没用的,索引在那儿MySQL就得在CURD的时候去管他。

如何确定一个索引是没用的?

  1. 使用索引监控工具
  2. 使用Explain查看查询是否覆盖索引

删除它会对业务有什么影响?

如果要评估这个问题,比较靠谱的方案就是你删除这个索引,然后走一遍发版流程,性能测试就得仔细做。确定这个索引可以删除就可以直接用drop命令删除它。

有没有更安全的做法?

那就可以使用不可见索引了。

先将索引设置为不可见,然后进行性能评估,在得到性能评估报告显示没有明显的性能减低以后再把它删除。

不可见索引尤其可以在你不确定一些新特性是否还用某个索引的时候尤其用用。你只要把索引设置为不可见,那么就可以测试新特性然后来决定删除新这个索引。

简单体验下吧

索引可见与不可见更改

  1. 更改索引为不可见

  2. 更改索引为可见

实际执行一下

第1步

我mysql 8.0 test数据库有一张sys_user表,sys_user表有一个name_pinyin字段,我给这个字段添加一个索引idx_name。

然后我explain 以下通过nam_pinyin查询记录,Extra字段显示是Using index,截图如下:

a51300495620669271b57631cf5f1c6f.png

第2步

我把idx_name索引设置为不可见,然后再执行相同的explain语句,Extra显示为Using where,截图如下:

ce8032c1975d4dd4cfd44d9bdfd35995.png

第3步

我把idx_name索引设置为可见,然后再执行相同的explain雨具,Extra显示Using index,截图如下:

38317b0a4895e37c175454f3e6ea9fef.png

Using index和Using where区别

  1. Using index显示使用了索引而且是覆盖索引,如果不清楚覆盖索引可以看下我之前发的覆盖索引的文章。这里是覆盖索引主要是因为我的sys_user表只有两个字段:id和name_pinyin,我选择name_pinyin字段创建一个二级索引,那么这个二级索引会关联聚簇索引,然后我用select * 查使用了这个索引并且不用回表。
  2. Using where type:ALL 表示全表扫表读取数据在内存中来判断where字句的条件有没有满足。为什么在文件里面不能匹配,因为操作系统只有先把数据加载到内存在能进行操作……哈哈。。。

 

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 8.0MySQL 数据库的最新版本,它带来了许多新的功能和改进,以下是其中一些新特性: 1. 支持 Window Functions:MySQL 8.0 引入了窗口函数,允许用户在查询中执行分析函数。 2. 支持 Common Table Expressions (CTE):CTE 是一种创建临时结果集的方式,可以在一个查询中多次使用。MySQL 8.0 引入了 CTE 功能,使得查询语句更加简单、易懂。 3. 支持 JSON 数据类型:MySQL 8.0 引入了 JSON 数据类型,可以存储和操作 JSON 数据,使得处理 JSON 数据更加方便。 4. 支持 Invisible Indexes:Invisible Indexes 是一种新的索引类型,可以隐藏不需要使用的索引,从而提高查询性能。 5. 支持 Descending Indexes:MySQL 8.0 支持为索引指定排序规则,用户可以指定升序或降序。 6. 支持 Grouping Sets:Grouping Sets 是一种新的 GROUP BY 子句,可以对结果集进行多个分组操作。 7. 支持 Window Functions 和 GROUP BY 子句同时使用:MySQL 8.0 允许用户在 GROUP BY 子句和 Window Functions 之间进行组合使用,使得查询更加灵活。 8. 支持更加安全的密码验证方法:MySQL 8.0 引入了一种更加安全的密码验证方法,可以保护用户的密码不被盗用。 9. 支持更加严格的模式:MySQL 8.0 引入了一个新的 SQL 模式,可以强制执行更加严格的 SQL 标准,避免出现一些常见的错误。 总之,MySQL 8.0 带来了许多新的功能和改进,可以提高数据库的性能、安全性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值