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

news2024/11/15 8:37:26

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

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

在这里插入图片描述

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

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

相关文章

Java面试必问题17:ArrayList与LinkedList区别

是否保证线程安全: ArrayList 和LinkedList 都是不同步的,也就是不保证线程安全;底层数据结构: Arraylist 底层使用的是Object 数组;LinkedList 底层使用的是双向链表 数据结构(JDK1.6 之前为循环链表&…

Frida 官方手册 中文版 ( 机翻+人翻 )

Frida 英文文档:https://frida.re/docs/home/ Frida 中文文档:https://pypi.org/project/frida-zhongwen-wendang/ 目的:给自己一个认真阅读文档的机会!!! 部分名词找不到合适的中文表达,直接使…

Day18 代码随想录(1刷) 二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二叉树的节点个数的范围是 [1,104]…

echarts 柱形图如何让其中一个柱子的颜色跟其他柱子不同

如何让其中一个柱子的颜色跟其他柱子不同 series: [{data: [120,// 使用对象的形式, value代表当前值, itemStyle设置样式{value: 200,itemStyle: {color: #a90000}},150,80,70,110,130],type: bar}]设置单个柱子颜色: 柱形图单个柱子颜色: https://e…

AI预测福彩3D第17弹【2024年3月25日预测--第4套算法重新开始计算第3次测试】

昨天对第4套算法进行了第二次测试,其中第二套方案已成功命中。测试的目的主要是为了记录统计两套方案的稳定性和命中率。今天继续对第4套算法进行测试,今天是第3次测试,同样测试两个方案。废话不多说,直接上结果。 2024…

【Qt问题】Qt中文乱码问题解决方案(详细汇总)

【Qt问题】Qt中文乱码问题解决方案(详细汇总) 一、问题描述: 由于Qt对中文的支持不是很好,使用QtCreator进行开发的过程中,经常会出现各种乱七八糟的中文乱码问题,比如我前面遇到的 【Qt问题】初始化菜单…

一个开源的分布式在线教育系统

项目介绍 roncoo-education —— 一个分布式在线教育系统。目前主要功能有课程点播功能,支持多家视频云的接入,课程附件管理功能,支持多家存储云的接入,可以帮助个人或者企业快速搭建一个轻量级的在线教育平台。 系统分为后台、前…

Python数据匹配和记录链接库之recordlinkage使用详解

概要 Python的recordlinkage库为数据匹配和记录链接提供了一个强大的工具集,使得从不同数据源识别重复或相关记录变得简单高效。这对于数据清洗、合并数据集、实体识别等任务至关重要。 recordlinkage库简介 recordlinkage提供了一套全面的工具来进行复杂的记录比较、匹配和…

程序人生 - 某程序员哀叹:辛辛苦苦写几年代码,做了些业务,有了点成就感,但回头一看80%都没用,没法写到简历上!

什么事情会让你脊背一凉,细思极恐? 一位程序员说了一件很可怕的事: 辛辛苦苦写了几年代码,做了些业务,在一片祥和中有了点成就感。然而回头一看,80%是没啥用的,甚至没法写到简历上&…

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee,创建你的远程仓库,根据提示初始化本地仓库(这里以我的仓库为例) 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增(变…

HTTP状态码(3)

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作 状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常…

vue+elementUI实现树形穿梭框

1.实现效果 2.整体思路 将左侧选中的节点移动到右侧,还要保持树结构,意味着移动子节点,需要把该子节点对应的父节点甚至父节点的父节点一并移到右侧形成一个新的树结构,树结构的层级和原来的树保持一致,只是右侧展示…

TOP、CCF、IEEE-Trans系列SCI,均2个月左右录用!进展超顺!

能源工程类SCIE(中科院TOP,周期短) 【期刊简介】IF:11.0-12.0,JCR1区,中科院1区TOP 【出版社】ELSEVIER出版社 【版面情况】正刊,2024.03.31截稿 【预警情况】2020-2024年无预警记录 【检索…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

在线一问一答网页版源码系统 源码全开源可二次开发 带完整的安装代码包以及系统搭建教程

在信息化社会,知识共享和互动交流成为了人们日常生活和工作中不可或缺的一部分。在线问答系统作为连接知识提供者和需求者的桥梁,具有广阔的市场前景和巨大的社会价值。然而,传统的问答系统往往存在功能单一、定制性差、开发成本高等问题&…

数据库读写分离分案

环境:MySQL主从数据库。如需要搭建可参考上一篇文章:MySQL主从数据库简单搭建 数据库使用主从可确保数据一致性,示例是基于一个完整的项目之上做了一些修改,为测试效果直接连接了两个非主从配置的数据库,其中只有测试…

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时,看不到多久可以完成,虽然加上-v参数也只能看到正在拷贝文件,那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

Vite+Vue3+TS+Vue-Router+Axios+Pinia开发模板

一、模板介绍 VUE3开发全家桶模板,安装了ts,router,axios,pinia并提供了简单示例并提供了它们的官网链接。 对axios进行了简单封装。 二、下载地址 https://github.com/yigedayouzi/ViteTemplateOne 三、快速开始 1、git clone gitgithub.com:yigedayouzi/Vite…

备忘录导出的HTML文档转换MarkDown尝试记录

备忘录导出的HTML文档转换MarkDown尝试记录 1. pandoc命令行2. HTML转换MARKDOWN3. MD导入CSDN记录过长报错及压缩尝试参考 本地备忘录写了些旅游攻略,想做个纪念,导出为长图片ok,导出为HTML,也可以。但是导出图片是base64格式的&…

VMware Live Site Recovery 9.0 - 数据中心灾难恢复 (DR)

VMware Live Site Recovery 9.0 - 数据中心灾难恢复 (DR) VMware Site Recovery Manager, VMware SRM 现已更名为 VMware Live Site Recovery 请访问原文链接:https://sysin.org/blog/vmware-live-site-recovery-9/,查看最新版。原创作品,转…