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,截图如下:

file

第2步

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

file

第3步

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

file

Using index和Using where区别

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali安装docker(亲测有效)

第一步:添加Docker官方的GPG密钥 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - 第二步: 第二步更新源 echo deb https://download.docker.com/linux/debian stretch stable> /etc/apt/sources.list.d/docker.list…

数据结构——树与二叉树

目录 树与二叉树 1.树的定义 2.树的有关术语 3.二叉树(BinaryTree) 二叉树的性质: 特殊的二叉树 满二叉树: 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 二叉树以及对应接口的实现 1.二叉树架构搭建 2…

关于 Microsoft Visual Studio

关于 Microsoft Visual Studio References References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【机器学习300问】47、如何计算AUC?

一、AUC是什么? (1)文绉绉的定义 AUCArea Under the Curve中文直译叫“曲线下面积”,AUC名字里面的Curve曲线指的就是ROC曲线,关于ROC曲线的相关知识我已经在之前的文章中详细说过了,有需要的友友可以点击…

CI/CI实战-jenkis结合gitlab 4

实时触发 安装gitlab插件 配置项目触发器 生成令牌并保存 配置gitlab 测试推送 gitlab的实时触发 添加jenkins节点 在jenkins节点上安装docker-ce 新建节点server3 安装git和jdx 在jenkins配置管理中添加节点并配置从节点 关闭master节点的构建任务数

革新水库大坝监测:传统软件与云平台之比较

在水库大坝的监测管理领域,传统监测软件虽然曾发挥了重要作用,但在多方面显示出了其局限性。传统解决方案通常伴随着高昂的运维成本,需要大量的硬件支持和人员维护,且软件整合和升级困难,限制了其灵活性和扩展性。 点击…

Neo4j桌面版导入CVS文件

之后会出来一个提示框,而且会跳出相关文件夹: 然后我们将CSV文件放在此目录下: 我们的relation.csv是这样的 参见: NEO4J的基本使用以及桌面版NEO4J Desktop导入CSV文件_neo4j desktop使用-CSDN博客

C++11:左值与右值|移动构造|移动赋值

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:マイノリティ脈絡—ずっと真夜中でいいのに。 0:24━━━━━━️💟──────── 4:02 🔄 …

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…

Zabbix Web界面中文汉化

要想达到上图的效果,第一步先查看 /usr/share/zabbix/assets/fonts/ [rootservice yum.repos.d]# ll /usr/share/zabbix/assets/fonts/ 总用量 0 lrwxrwxrwx. 1 root root 33 3月 23 16:58 graphfont.ttf -> /etc/alternatives/zabbix-web-font 继续查看graph…

基于霍夫检测(hough变换)的人眼瞳孔定位,Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

vue实现饼图渲染的步骤

1) 创建一个DOM对象,有自定义的高和宽. 2) 引入Echarts软件包并导入到对应文件内 npm i Echarts import 文件.js script src.../文件 3) 初始化一个对象 4) 对象的方法实现饼图渲染 data内的数据,且当一个对象已经渲染一遍,再执行这个,会对setOption的参数进行更新,其…

Linux的学习之路:2、基础指令(1)

一、ls指令 上篇文章已经说了一点点的ls指令,不过那还是不够的,这篇文章会介绍更多的指令,最起码能使用命令行进行一些简单的操作,下面开始介绍了 ls常用选项 -a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -d…

02课程发布模块之部署Nginx

部署Nginx 部署网关 通过Nginx访问后台网关,然后由网关再将请求转发到具体的微服务,网关会把请求转发到具体的服务 upstream gatewayserver{server 127.0.0.1:63010 weight10; } # 网站首页对应的虚拟机 server {listen 80;server_name www.51xuecheng.cn…

Yoast插件:您的WordPress网站SEO优化利器

在之前的文章中我们介绍了如何低成本使用WordPress来搭建个人网站,相信很多朋友都希望自己的网站能够被搜索引擎所收录,并获得更高的排名,从而吸引更多的流量和用户。如果是的话,您需要了解SEO(搜索引擎优化&#xff0…

使用git+ssh访问github,避免下载资源失败

一、创建github账户之后,记住注册邮箱和账户名 我的邮箱:yuanyan23mails.ucas.ac.cn 账户名:thekingofjumpshoot 下边的相关位置需要用自己的邮箱和用户名替代 二、输入本地生成秘钥和公钥命令,并且生成公私钥对 ssh-keygen …

初识进程的地址空间、页表

一、&#x1f31f;问题引入 &#x1f6a9;代码一&#xff1a; #include<stdio.h>#include<unistd.h>int g_val100;int main(){pid_t idfork();if(id0){//子进程while(1){printf("I am a child pid:%d ppid:%d g_val:%d\n",getpid(),getppid(),g_val);…

AOF 持久化是怎么实现的?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) AOF 日志 试想一下&#xff0c;如果 Redis 每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到一个文件里&#xff0c;然后重启 Redis 的时候&#xff0c;先去读取这个文件里的命令&#xf…

使用Intellij idea编写Spark应用程序(Scala+Maven)

使用Intellij idea编写Spark应用程序(ScalaMaven) 对Scala代码进行打包编译时&#xff0c;可以采用Maven&#xff0c;也可以采用sbt&#xff0c;相对而言&#xff0c;业界更多使用sbt。这里介绍IntelliJ IDEA和Maven的组合使用方法。IntelliJ IDEA和SBT的组合使用方法&#xf…

FANUC机器人零点标定的基本步骤(出厂数据)

FANUC机器人零点标定的基本步骤(出厂数据) FANUC 零点数据存在问题的机器人通常会出现以下几种报警: (1)SRVO-062报警 - 脉冲编码器数据丢失,机器人完全不能动,具体消除方法可参考以下链接中的内容: FANUC机器人SRVO-062报警原因分析及处理对策 (2)SRVO-075报警 -…