加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

MYSQL 面试官问你,你了解索引吗?

发布时间:2022-10-27 17:30:56 所属栏目:MsSql教程 来源:转载
导读: 如果你已经对数据库的索引非常熟悉和了解了,那么你可以跳过此篇。
如果你还不清楚为什么主键查询比通过普通索引查询快,不清楚索引数据结构是什么样?并且你感兴趣请继续阅读。
本文主要讲

如果你已经对数据库的索引非常熟悉和了解了,那么你可以跳过此篇。

如果你还不清楚为什么主键查询比通过普通索引查询快,不清楚索引数据结构是什么样?并且你感兴趣请继续阅读。

本文主要讲解索引的数据结构和查询的算法。

为保证大家10分钟能看完并且有效的吸收,覆盖索引,对索引的合并,分裂,重建,更新不在此篇幅内,会在后续的篇幅内展开。

什么是索引:

我就举一个栗子:像我这样的学渣上学的时候偶尔去一下图书馆(考试前)我们图书馆每一层放的书都是不同专业的,在门口的电子屏上会说明每层都放了哪些书。比如一层是社科类的,二层是理工科类的等。

当我做电梯到了二层的时候电梯边上会有一张区域图,每层每个区域放的书也不一样。比如东区是软件工程,西区是电子科学技术,我们按照指示牌很快就能找到我们想要的资料(写论文就靠这些资料了)。

这样我们就不用每一层每个区域去看一下,三步并做两步就能找到我们想找的书。这就是索引。

那么MYSQL的B+ 树索引怎么快速的定位到我们想要找的数据的呢?我想大家对二分查找很熟悉了,16个球其中一个稍微重点,用天枰把它找出来之类的面试题做的不少,那么B+ 树就是在此基础上进行了扩展。

在我们举栗子之前我们先要知道MYSQL的索引分为聚集索引和辅助索引

聚集索引:按照每张表的主键构造一棵B+树,同时页子节点中存放的即为整张表的行记录数据。

辅助索引:页子节点并不包含记录的全部数据。可以认为页子节点上存储了主键的ID。

假设我们数据库中有这么些数据:id为主键

mssql 索引错误 备份恢复_mssql 创建索引_mssql重建索引

那么主键上的数据是一个怎样的树结构呢?

mssql重建索引_mssql 索引错误 备份恢复_mssql 创建索引

从这个树上我们知道一些信息:

如果把数据平铺开会发现他们是有顺序的。

最顶层的节点我们称之为Root节点,而一般情况下Root节点一般都会在内存中,那么如果通过主键查询数据,是怎样一个流程。

假设我们要查找id = 15的这条数据,看一下这个流程:

1:加载Root节点数据,发现15属于[7,21]这个区间,

2:加载这个区间的数据,发现15属于[11,19]这个区间

3:继续读取下一个节点的数据,发现15属于这个节点上,加载数据。

由于Root节点在内存中,那么查询ID = 15 这个数据进行了两次读磁盘操作。通过B+树来查找数据,大大减少了读取磁盘的次数,提高了效率。

那如果age字段的数据也有一棵B+树呢(给age字段增加辅助索引)?

mssql重建索引_mssql 索引错误 备份恢复_mssql 创建索引

那么按照以上这个树查找age = 22 的数据就两次磁盘读取。而读到的是主键ID数据1和15,然后在使用ID = 1和15访问聚集索引数据mssql重建索引,找到最终的行数据(大家发现通过辅助索引查询数据有一个回表的操作)。

现在可以解释数据库为什么加了索引后查询数据就变得特别快,因为不需要扫描整个表,而是通过一个又一个的范围定位到最终的数据。

在我还对索引不了解的时候,表中两个字段有索引,如果条件中使用了这两个字段,我会天真的以为这两个字段都能用到索引。而实际情况并非如此,了解了索引的原理才知道MYSQL只会选择其中一个索引,将数据加载到内存后再次进行条件的判断。

在MYSQL中,上面每个节点称为一个页(Page),而MYSQL中页是磁盘管理的最小单位(其实从磁盘中加载数据不是按照行加载的,而是每次读取一页数据)。我们可以看一下数据页的结构:

mssql 索引错误 备份恢复_mssql 创建索引_mssql重建索引

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!