MySQL 中 聚集索引、非聚集索引、覆盖索引、索引下推 到底是什么

一、什么是 聚集索引、非聚集索引

MySQL数据库中,索引是提高查询效率的关键。而聚集索引、非聚集索引、覆盖索引、索引下推其实是索引优化的重要策略之一。那这些名词的含义到底是什么呢?

在开始分析前,先来了解下 B+ 树的索引结构 和 回表查询:

B+ 树结构

B+树是 B树的变体,将树的结构分为了叶子节点非叶子节点。其中非叶子节点不存储具体数据,只存放主键和指向下一级数据的指针。而叶子节点在最尾端,存放主键和指向数据行的地址。叶子节点和非叶子节点采用指针连接,例如下面结构:

在这里插入图片描述
也就是叶子节点包含了主键ID和数据行信息,找到具体叶子节点也就找到了具体数据。

什么是回表查询

回表查询主要针对于非主键索引的情况下,在主键索引中叶子节点包含了主键和数据行信息。但是非主键索引的叶子节点就不是包含主键和数据行信息了,而是索引和该数据的主键ID,所以要拿到完整的行信息,就需要再拿着主键去主键索引中查询一次获得数据,这个过程就叫做回表查询。

了解到这里就可以先来看下 聚集索引非聚集索引了。

聚集索引

聚集索引其实就是上面的 B+树结构,也就是主键索引 就是 聚集索引,它按照数据存储顺序排列,叶子节点包含了整行数据,数据行的物理顺序和索引顺序一致,这样可以减少磁盘 I/O 操作,提高查询效率。

假设有一个名为 user 的表,其中包含 id(主键)、nameagesex 字段。如果我们在id上创建了聚集索引,那么当我们根据 id 进行查询时,数据库引擎会直接通过索引找到对应的数据行,而不需要再进行二次查找,从而提高查询速度。

非聚集索引

非聚集索引其实也就是上面提到的非主键索引的情况下,非聚集索引并不影响数据在磁盘上的存储顺序,而是在磁盘上额外创建一个索引文件,用于存储索引的键和指向对应数据的主键。当根据非聚集索引的列进行查询时,会首先在索引文件中找到对应的主键,然后再查询到实际的数据行。

还是以 user 表为例,如果我们在 name 字段上创建了一个非聚集索引,那么当根据 name 进行查询时,会首先查找索引文件中的 name 键,获得主键 id ,然后再通过主键 id 找到对应的数据行。这种情况下可以加速基于非主键字段的查询,但相比聚集索引会稍慢一些。

二、什么是覆盖索引、索引下推

上面讲述的 聚集索引 和 非聚集索引主要关注点在单索引上的设计不同,而 覆盖索引 和 索引下推,则会关注到 联合索引 或 多个索引 的情况下。

覆盖索引

覆盖索引就是指查询的结果可以直接通过索引返回,而不必再去查找表的数据。当查询语句所需的字段都包含在索引中时,就可以利用覆盖索引,减少对数据表的访问,提高查询性能。也就是减少回表查询的过程。

继续以上面的users表为例,如果我们需要查询所有满足 age > 30 条件的 idagename 字段,其中在 agename 字段上创建了联合索引,那么数据库引擎可以直接通过索引返回满足条件的数据,而不必再去查找原始数据行信息,从而提高查询效率。

但是如何还要查询 sex 字段,此时覆盖索引就不满足了,需要进行回表查询补充完整的数据信息。

索引下推

索引下推(Index Condition Pushdown,简称ICP)是MySQL 5.6版本引入的一种优化技术,将应该在 server 层进行筛选的条件,尽量下推到存储引擎层来进行筛选判断,目的也是减少 回表查询 的过程。它可以在索引的扫描过程中,对索引条件进行判断和过滤,减少不必要的行访问,从而提高查询性能。

在这里插入图片描述

MySQL 中该功能默认是开启的,可以使用下面指令查看:

select @@optimizer_switch;

在这里插入图片描述

如果想要关闭或开启可以使用下列指令:

关闭索引下推:

set optimizer_switch = 'index_condition_pushdown=off'

开启索引下推:

set optimizer_switch = 'index_condition_pushdown=on'

这里举个例子来理解下索引下推,还是上面 user 表,假如给 nameage 字段设置了联合索引,然后进行查询:

 select id,name,age from user where name like '小%' and age > 15

当没有索引下推的时候:

  1. 通过联合索引找到 name like '小%' 的主键 ID
  2. 然后进行回表找个数据行信息,交给 server
  3. server 再根据其余条件进行筛选。

当有索引下推的时候:

  1. 通过联合索引找到 name like '小%' 的索引信息。
  2. 判断索引中是否有 age ,如果有则一起筛选。
  3. 返回信息给到 server

索引下推的目的是为了减少回表次数,主要减少磁盘的IO操作。主要针对于非聚集索引的一种优化手段。

通过 explain 也可以看出是否进行了索引下推:

explain select * from user where name like '小%' and age > 15

当开启了 索引下推 时,Extra 使用的是 Using index condition

在这里插入图片描述

当关闭 索引下推 时,Extra 使用的是 Using where

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云服务器如何购买?图文全流程,2024最新整理

腾讯云服务器购买流程很简单,有两种购买方式,直接在官方活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动…

【技术类-05】python实现docx段落文字加粗(Win32)

背景需求: 【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”-CSDN博客文章浏览阅读1k次,点赞10次,收藏10次。【技术类-04】python实现docx表格…

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…

前端调用接口地址跨越问题,nginx配置处理

在nginx配置里面添加add_header如下: add_header Access-Control-Allow-Origin *; #add_header Access-Control-Allow-Origin http://localhost:8080 always; add_header Access-Control-Allow-Methods GET, POST, PUT, D…

C++命名空间和内联函数

目录 命名空间 内联函数 概述 特性: 命名空间 在C/C中,变量,函数和和类这些名称都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突或名字污染&…

对话Midjourney创始人:图片仅是起步,人工智能将全面改变学习、创意和组织。

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ​ 发布在https://it.weoknow.com 关注我 Midjourney 是一家神奇的公司,11 人改变世界,创造伟大的产品。…

Pycharm小妙招之Anaconda离线配环境

Pycharm小妙招之Anaconda离线配环境———如何给无法联网的电脑配python环境? 1. 预备工作2. 电脑1导出包2.1 环境路径2.2 压缩py38导出至U盘 3. 电脑2导入包4. 验证是否导入成功4.1 conda查看是否导入4.2 pycharm查看能否使用 1. 预备工作 WINDOWS系统电脑1(在线)…

CICD流水线(ali)

后端CICD 一、打开云效流水线,创建流水线

Express:快速搭建Node.js应用的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

局域网内的手机、平板、电脑的文件共享

在日常工作生活中,经常需要将文件在手机、平板、电脑间传输,以下介绍三种较为便捷的方法: 1.LocalSend 该软件是免费开源的,可以在局域网内的任意手机、平板、电脑间传递文件,并且任意一方都可以作为“发送方”和“接…

FDM3D打印系列——美纹纸遮挡喷漆

大家好,我是阿赵。   自从上次尝试了水补土和喷漆,发现效果不错之后,我就接着进行第二次的尝试了。   这次打印的模型是这个拳皇里面的卢卡尔,别看拍照好像很高大,其实这个模型很小的,只有10cm左右的高…

ClickHouse部署安装

准备工作 确定防火墙处于关闭状态 CentOS取消打开文件数限制 在hadoop102的 /etc/security/limits.conf文件的末尾加入以下内容 注意:以下操作会修改 Linux 系统配置,如果操作不当可能导致虚拟机无法启动,建议在执行以下操作之前给…

Kafka总结问题

Kafka Kafka Kafka Kafka的核心概念/ 结构 topoic Topic 被称为主题,在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。topic 相当于消息的分配标签,是一个逻辑概念。主题好比是数据库的表&#xff0…

React系列 之 React进阶 含源码解读 (一)事件合成、state原理

资料来源:掘金课程 https://juejin.cn/book/6945998773818490884?enter_fromcourse_center&utm_sourcecourse_center 记录一些笔记 事件合成 React的事件其实是React重新实现的一套事件系统。目标是统一管理事件,提供一种跨浏览器一致性的事件处…

【LabVIEW FPGA入门】FPGA 存储器(Memory)

可以使用内存项将数据存储在FPGA块内存中。内存项以2kb为倍数引用FPGA目标上的块内存。每个内存项引用一个单独的地址或地址块,您可以使用内存项访问FPGA上的所有可用内存。如果需要随机访问存储的数据,请使用内存项。 内存项不消耗FPGA上的逻辑资源&…

Unity 中 苹果眼镜开发入口

1. 文档介绍了Unity对Apple新操作系统visionOS的支持。 2. Unity提供了完善的文档、模板和支持,帮助开发者快速为visionOS开发应用。 3. Unity的跨平台框架AR Foundation和XR Interaction Toolkit可以帮助现有移动和XR应用无缝迁移到visionOS。 4. 在visionOS上,可以利用Uni…

Linux:Jenkins全自动持续集成持续部署(3)

在上一章部署好了之后,还需要点击一下才能进行部署,本章的效果是:当gitlab上的代码发生了变化后,我们不需要做任何事情不需要去点击构建按钮,Jenkins直接自动检测变化,然后自动去集成部署Linux:…

vue 修改element-plus主题色

一、安装SCSS npm install sass --save-dev npm install sass-loader --save-dev npm install node-sass --save-dev npm install vue-style-loader --sava-dev 二、添加主题文件theme.scss forward "element-plus/theme-chalk/src/common/var.scss" with ($col…

autodl数据集下载及裁剪子图像操作

一、autodl数据集下载 里面数据集可以直接使用 一般是先用无卡模式对数据集进行解压,然后移动文件夹到指定位置 1.解压操作如下 unzip 压缩包路径 -d 解压文件夹 2.移动操作如下 mv 移动前文件夹 移动后文件夹 3.移动文件夹内的文件 以下命令将当前目录下名为sourc…