【强烈建议收藏:MySQL面试必问系列之索引专题】

news2024/12/23 15:46:56

在这里插入图片描述

一.知识回顾

前面的文章我们一起学习了数据库的事务、事务以及并发来的问题、数据库锁机制、数据库中CURD的SQL语句底层执行流程、数据库SQL优化专题,如果你一步一步的跟下来,一定会帮助你建立一个知识体系。接下来我们再一起学习数据库索引专题,当让之前的文章中我也大致的总结了数据库的索引,可以和本篇文章结合起来一起进行学习。【Mysql面试之索引常见的面试问题】,接下来,我们再来总结一下数据库的索引专题,检测一下你掌握的怎么样?话不多说,直接开整。

二.索引的基本概念以及基本原理

2.1 基本概念

  1. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。
  2. 数据库索引,是数据库管理系统中一个排序的数据结构, 以协助快速查询、更新数据库表中数据。
  3. 索引的实现通常使用B树及其变种 B+树。 更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。
  4. 索引是一个文件,它是要占据物理空间的。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中。

2.2 基本原理

  1. 索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
  2. 索引的原理很简单,就是把无序的数据变成有序的查询,把创建了索引的列的内容进行排序,对排序结果生成倒排表,在倒排表内容上拼上数据地址链,在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据。

2.3 创建使用方式

这个地方不做过多描述了,之前的文章中有,大家直接点击链接,跳转学习即可。
【Mysql面试之索引常见的面试问题】

三.索引的优点和缺点

3.1 优点

  1. 可以提高数据检索的效率,降低数据库的IO成本。
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。被索引的列会自动进行排序,包括单列索引和组合索引,但是组合索引的排序比我们的单列索引要复杂一些。如果按照索引列的顺序进行排序,对应order by语句来说,效率会更高。

3.2 缺点

  1. 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的,索引会占据磁盘空间。

  2. 索引虽然会提高查询效率,但是会降低更新表的效率。每次对表进行增删改操作的时候,不仅要更新数据,还需要进行更新对应的索引文件。

四.索引的数据结构

4.1 Hash表

  1. Hash表,以键值对的方式存储数据;
  2. 使用Hash表存储表数据Key可以存储索引列,Value可以存储行记录或者行磁盘地址;
  3. Hash表在等值查询时效率很高,时间复杂度为O(1);
  4. Hash表是基于内存的,当有大量数据的时候效率就不高了;
  5. Hash表不支持范围快速查找,范围查找时还是只能通过扫描全表方式;

4.2 二叉搜索树

  1. 二叉树有父子节点,每个节点最多有俩个节点。
  2. 左子树的值小于根节点的值,根节点的值小于右子树的值。
  3. 每次进行查找的时候直接进行折半查找,从而减少IO的次数,这是整个操作的时间复杂度是O(logN)。
  4. 但是二叉树存在最明显的问题就是当所有的节点都在左子树或者都在右子树的时候,那么这个时候整个BST就会退化成一个链表,时间复杂度也会急剧下降,由之前的O(logN)退化为O(N)。

4.3 平衡二叉树

  1. 为了解决二叉搜索数链化的问题,此时我们在原来的基础上再次进行改进,加上平衡调整的操作,保证整个二叉搜索树是平衡的,不会出现链化的问题。

  2. 平衡二叉搜索树继承了二叉搜索树的基本特点,同样我们通过左旋和右旋操作来维持整个二叉树的平衡,保证左右两个子树的层级最多相差1。在插入删除数据时通过左旋/右旋操作保持二叉树的平衡,不会出现左子树很高、右子树很矮的情况。

  3. 使用平衡二叉查找树查询的性能接近于二分查找法,时间复杂度是 O(log2n)。

  4. 虽然平衡二叉树解决了上述我们提到的问题,但是还存在一些问题:

    问题1:时间复杂度和树的高度紧密相关。树的高度就等于每次查询数据时磁盘 IO 操作的次数。当有海量的数据的时候,查询性能会非常的差。
    问题2:不支持指定区间范围检索。平衡二叉树不支持范围查询快速查找,范围查询时需要从根节点多次遍历,查询效率不高。

4.4 B树

通过上面的分析,我们知道虽然平衡二叉搜索树性能很优秀了,但是还依然存在一些问题,饭要一口一口吃,问题也要一个一个解决,所以,我们先来解决第一个问题。那么怎么解决这个问题呢?既然时间复杂度和树的高度有关,那么我们就直接降低树的高度不就可以了吗?问题又来了,怎么降低树的高度呢?那将原来的二叉树变成多叉树不就解决了,确实是,接下来我们一起来看一下具体的一些细节。

  1. B树是一种多叉平衡查找树;
  2. B树的节点中存储着多个元素,每个节点有多个分叉;
  3. 节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。
  4. 父节点当中的元素不会出现在子节点中。
  5. 所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。

4.5 B+树

通过上面的分析,我们知道B树已经解决了第一个问题,但是还存在第二个问题,就是如何进行范围检索,如果检索范围的数据呢。那么怎么解决这个问题呢?我们在原来的B树的基础上继续更新迭代,B+树很好的帮我们解决了这个问题。

  1. B+树作为B树的加强版,具备了B树所有的基本特征。
  2. B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。
  3. 获取整个数据库以及表的效率更高。如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵 B+树拿到所有的数据。
  4. B+树的磁盘读写能力相对于 B Tree 来说更强,同数据量下磁盘I/0次数更少。所有的数据都被保存在叶子节点中,一次磁盘加载的数据更多。
  5. 最核心的是帮我们解决了范围查询的问题,因为叶子节点上有下一个数据区的指针,数据形成了链表。
  6. B+树效率更加稳定,B+树永远是在叶子节点拿到数据,所以 IO 次数是稳定的。

五.索引的类型

5.1 普通索引

MySQL中基本索引类型,允许在定义索引的列中插入重复值和空值。

5.2 主键索引

索引列中的值必须是唯一的,不允许有空值。

5.3 唯一索引

索引列中的值必须是唯一的,但是允许为空值。

5.4 全文索引

  1. 只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。
  2. 字段长度较大时,如果使用普通索引,在进行like模糊查询时效率比较低,可以创建全文索引。

5.5 前缀索引

在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

5.6 索引个数(单列索引、组合索引)

  1. 只包含一个字段的索引叫做单列索引
  2. 两个或以上字段的索引叫做复合索引。建立复合索引时,字段的顺序极其重要。组合索引的使用,需要遵循最左匹配原则。

5.6.1 最左匹配原则

  1. 在建立索引的时候,尽量在多个单列索引判断下是否可以使用联合索引。
  2. 联合索引不仅可以节省空间,还可以更容易的使用到索引覆盖。
  3. MySQL会一直向右匹配直到遇到范围查询 (>,<,BETWEEN,LIKE)就停止匹配。

5.6.2 联合索引的创建原则

  1. 在创建联合索引的时候因该把频繁使用的列、区分度高的列放在前面,频繁使用代表索引利用率高,区分度高代表筛选粒度大。
  2. 可以在常需要作为查询返回的字段上增加到联合索引中。
  3. 索引列不能参与计算,否则整个效率会降低。

5.6.3 联合索引的使用

  1. 考虑当前是否已经存在多个可以合并的单列索引,如果有,那么将当前多个单列索引创建为一个联合索引。
  2. 当前索引存在频繁使用作为返回字段的列,可以考虑当前列是否可以加入到当前已经存在索引上,使其查询语句可以使用到覆盖索引。

5.7 空间索引

MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。

六.创建索引的原则

这个地方也不做过多描述了,之前的文章中有,大家直接点击链接,跳转学习即可。
【Mysql面试之索引常见的面试问题】

七.请你说说聚簇索引和非聚簇索引

7.1 主要区别

两者主要区别是数据和索引是否分离。

7.2 聚簇索引

  1. 聚簇索引是将数据与索引存储到一起,找到索引也就找到了数据;
  2. 在InnoDB中,一个表有且仅有一个聚簇索引,并且该索引是建立在主键上的,即使没有指定主键,也会特殊处理生成一个聚簇索引;其他索引都是辅助索引,使用辅助索引访问索引外的其他字段时都需要进行二次查找。

7.3 非聚簇索引

  1. 非聚簇索引是将数据和索引存储分离开,索引树的叶子节点存储了数据行的地址。
  2. 在MyISAM中,所有索引都是非聚簇索引,叶子节点存储着数据的地址,对于主键索引和普通索引在存储上没有区别。

7.4 总结

  1. 在InnoDB存储引擎中,可以将B+树索引分为聚簇索引和辅助索引(非聚簇索引)。
  2. 无论是何种索引,每个页的大小都为16KB,且不能更改。
  3. 聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录。
  4. 辅助索引是根据索引键创建的一棵B+树,与聚簇索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。如果通过辅助索引来查找数据,那么当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚簇索引来得到数据,这种查找方式又被称为书签查找,又叫回表。
  5. 因为辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚簇索引。

八.回表与索引下推

8.1 回表的基本概念

一般数据库建表时,会创建索引,以普通索引为例,创建的索引结构中包含的是聚簇索引的值(一般就是主键id),在根据此普通索引进行查询时,首先会查到普通索引的位置,比如下标是110,那么会从110处取出聚簇值,也就是id值,再拿id值取表中取数据,这个过程就叫做回表。

8.2 覆盖索引

  1. 非聚簇索引可能会需要回表查找数据的操作,那我们怎么能做到不回表呢?自己的索引上就查到需要的数据,不需要去主键索引查了。
  2. 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

8.2 索引下推

MySQL 5.6及其以后的版本引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

九.总结

关于MySQL的索引专题本篇文章就先介绍到这里,每一个专题、每一个知识点、毫不夸张的说,我们都可以展开一篇文章详细的学习,后续我还会不断的补充完善相关的知识。大家敬请期待。
我是硕风和炜,我们下篇文章见哦。
在这里插入图片描述

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

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

相关文章

Toponogov 比较定理及其应用

1. Toponogov 比较定理的背景来源 Victor Andreevich Toponogov&#xff08;1930-2004&#xff09; 是苏联数学家&#xff0c;Toponogov 比较定理是他的博士论文题目&#xff0c;在1958年答辩。他证明这个定理是为了用于证明截面曲率假设下的分裂定理和最大直径定理&#xff0…

具有精密内部基准的 DACx0502 简介及驱动应用示例

DACx0502 说明 16 位 DAC80502、14 位 DAC70502 和 12 位DAC60502 (DACx0502) 数模转换器 (DAC) 均为具有电压输出的高精度、低功耗器件。 DACx0502 线性度小于 1LSB。凭借高精度和微型封装特性&#xff0c;DACx0502 非常适合以下 应用&#xff1a; 增益和失调电压校准、电流…

计算机网络协议详解(二)

文章目录&#x1f525;HTTP协议介绍&#x1f525;HTTP协议特点&#x1f525;HTTP协议发展和版本&#x1f525;HTTP协议中URI、URL、URN&#x1f525;HTTP协议的请求分析&#x1f525;HTTP协议的响应分析&#x1f525;MIME类型&#x1f525;HTTP协议介绍 HTTP协议介绍 什么是超…

反转链表(精美图示详解哦)

全文目录引言反转链表题目描述与思路实现总结引言 在学习了单链表的相关知识后&#xff0c;尝试实现一些题目可以帮助我们更好的理解单链表的结构以及对其的使用。 从这篇文章开始&#xff0c;将会介绍一些编程题来帮助我们更好的掌握单链表&#xff1a; 分别是反转链表、链表…

大数据技术之Hadoop集群配置

作者简介&#xff1a;大家好我是小唐同学(๑>؂<๑&#xff09;&#xff0c;好久不见&#xff0c;为梦想而努力的小唐又回来了&#xff0c;让我们一起加油&#xff01;&#xff01;&#xff01; 个人主页&#xff1a;小唐同学(๑>؂<๑&#xff09;的博客主页 目前…

SpringBoot三种方法实现定时发送邮件的案例

前言 小编我将用CSDN记录软件开发之路上所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01;也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&#xff0c;让我们共…

了解java

#常见编程语言介绍 C语言 C语言 java语言 javaScript语言 PHP语言 python语言Object-C和Swift语言 C# &#xff08;c sharp&#xff09;语言 Kotlin语言 Go语言 Basic语言 #JAVA的发展 起源于1991年SUN公司GREEN项目&#xff0c;1996年JDK1.0正式发布 后被Oracle公司收购&…

卷积神经网络CNN之ZF Net网络模型详解(理论篇)

1.背景 2. ZF Net模型结构 3. 改进优缺点 一、背景 ZF Net是用作者的名字命名的&#xff0c;Matthew D.Zeiler 和 Rob Fergus &#xff08;纽约大学&#xff09;&#xff0c;2013年撰写的论文&#xff1b; 论文原网址https://arxiv.org/abs/1311.2901 论文名&#xff1a;Vis…

Vue2的基本内容(一)

目录 一、插值语法 二、数据绑定 1.单向数据绑定 2.双向数据绑定 三、事件处理 1.绑定监听 2.事件修饰符 四、计算属性computed和监视属性watch 1.计算属性-computed 2.监视属性-watch &#xff08;1&#xff09;通过 watch 监听 msg 数据的变化 &#xff08;2&a…

IronXL for .NET 2023.2.5 Crack

关于适用于 .NET 的 IronXL 在 C# 中阅读和编辑 Excel 电子表格&#xff0c;无需 MS Office 或 Excel Interop。 IronXL for .NET 允许开发人员在 .NET 应用程序和网站中读取、生成和编辑 Excel&#xff08;和其他电子表格文件&#xff09;。您可以读取和编辑 XLS/XLSX/CSV/TS…

Apollo控制部分1-- ControlComponent组件介绍

Apollo控制部分1-- ControlComponent组件介绍摘要一、ControlComponent1、启动文件解析2、ControlComponent()组件函数解析1&#xff09;ControlComponent::ControlComponent() 构造函数2&#xff09;ControlComponent::Init() 初始化函数&#xff08;执行一次&#xff09;3&am…

分享四个前端Web3D动画库在Threejs中使用的动画库以及优缺点附地址

Threejs中可以使用以下几种动画库&#xff1a;Tween.js&#xff1a;Tween.js是一个简单的缓动库&#xff0c;可以用于在three.js中创建简单的动画效果。它可以控制数值、颜色、矢量等数据类型&#xff0c;并提供了多种缓动函数&#xff0c;例如线性、弹簧、强化、缓冲等等。区别…

Linux性能学习(2.3):内存_为什么分配的内存比申请的内存大16个字节

文章目录1 验证申请不同内存&#xff0c;系统分配机制1.1 代码1.2 测试1.3 结论2 为什么会多分配内存3 为什么会有4字节不可使用参考资料&#xff1a;https://www.gnu.org/software/libc/ 在上一篇文章中&#xff0c;探讨了Linux系统对进程以及线程的内存分配问题&#xff0c;…

流程图简介

一、流程与流程图1. 什么是流程具体来说&#xff0c;流程是一项活动或一系列连续有规律的事项或行为进行的程序。流程有6个要素&#xff0c;分别是&#xff1a;资源、过程、结构、结果、对象和价值。一个流程会把这些基本要素串联起来&#xff0c;例如流程中资源的输入、流程中…

gprof2dot perf

什么是gprof2dot 这是一个用于将许多探查器的输出转换为点图Python脚本。 使用需要安装的依赖 Python: known to work with version 2.7 and 3.3; it will most likely not work with earlier releases.Graphviz: tested with version 2.26.3, but should work fine with ot…

【C++】类和对象补充知识点

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、再谈构造函数1.1 构造函数体赋…

逻辑电路代数运算(上)

逻辑代数L是一个封闭的代数系统&#xff0c;由一个逻辑变量集K&#xff0c;常量0和1&#xff0c;以及与或非三种基本运算构成。 参与逻辑运算的变量叫逻辑变量&#xff0c;用字母A&#xff0c;B……表示。每个变量的取值非0 即1。 0、1不表示数的大小&#xff0c;而是代表两种不…

三天吃透Java基础八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

Asp.net core api swagger显示中文注释

在你的 Web API 项目中使用 Swagger 的.NET Core 封装 Swashbuckle 可以帮助你创建良好的文档和帮助页面&#xff0c;Swagger (OpenAPI) 是一个与语言无关的规范&#xff0c;用于描述 REST API。 它使计算机和用户无需直接访问源代码即可了解 REST API 的功能1、OpenAPI 与 Swa…

IP定位离线库有什么作用?

IP离线是什么意思&#xff1f;我们以丢失手机为例来寻找它&#xff0c;现在手机都有IP定位功能&#xff0c;只要手机开通了IP定位&#xff0c;就能找到手机。iPhone定位显示离线一般是iPhone手机关机了或者iPhone手机中“查找我的iPhone”功能关闭了。如果手机在手中的话可以打…