浅谈MySQL索引及其数据结构

写在前面的话

本人只是一个普通的大三学生,对于MySQL接触其实也不久,也不深,如果有讲错的地方请大家私我或者评论告诉我哪里错了,我一定会及时改正,我也不想别人看了我的文章对MySQL有错误的理解,谢谢。

为什么突然想写这篇文章,因为我在看了很多博客跟视频之后,发现有一些博客的内容是存在歧义的,或是写得比较难以理解的,所以我想写一篇通俗易懂的,让每个人都能学会!

为什么要学

这是我在一个面试视频中听到的对话

# 节选
面试官:你说你熟悉MySQL,那你能跟我说说你一般会怎么优化吗
求职者:我一般都是添加索引
面试官:那你知道索引是什么样的数据结构吗
求职者:B+树
面试官:B+树跟B树的区别是什么呢
求职者:...(太长了就省略了)
面试官:了解过聚簇索引吗?
。。。。

可能很多人对这些都是有了解的,也可能有些人对这些概念还不是太熟悉,相信看完这篇文章,能让你对这些问题都有一个自己的答案。

索引(Index)

什么是索引?

这是我在MySQL官网找到的解释
MySQL官网解释索引
大致意思就是说:
索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行…大多数MySQL索引存储在 B-树(也就是B树,没有B减树这种东西)…

这里是我在其他地方看到的解释:
索引(Index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

说白了,索引的本质就是一种数据结构。它的作用在于,更快的查找。

假设在没有索引的情况下

在这里插入图片描述
如果在没有索引的情况下,我们想要搜索排在前面的数,时间花费是较少的,而如果当我们数据量较大,而查找的数据在比较后面时,无疑是很耗费时间的。

假设使用顺序查找二叉树作为索引

在这里插入图片描述
如果我们使用顺序查找二叉树作为索引的话,我们查找 5 将只需要查找3次就可以找到。而如果我们不使用索引我们将需要查找5次。

索引的分类

介绍完索引之后,我们再来看看到底有哪些索引,在上面介绍索引的时候,最后面其实还有一句话我没有翻译,大致意思为

大多数MySQL索引(PRIMARY KEY, UNIQUE,INDEX和 FULLTEXT)存储在 B树。空间数据类型的索引使用R树;MEMORY 表还支持哈希索引 ; InnoDB对FULLTEXT索引使用倒排列表。

  • B树索引:大多数MySQl索引
  • R树:空间数据类型的索引
  • 哈希索引:MEMORY表
  • FULLTEXT(全文索引):这是InnoDB在5.6版本之后加入的

PS:这里先引入了InnoDB这种存储引擎的概念,如果没有了解过可以不用紧张,后面还会慢慢说的。

B树索引

B树索引故名思意就是使用B树的数据结构(实际并不是B树),如果想要彻底搞懂B树索引,我们得先了解什么是B树

B树

概念

B树跟后面的B+树,还有B*树都是属于多路平衡查找树

  • 树中的每个结点最多包含m个孩子
  • 除根节点与叶子结点外,每个结点至少有[ceil(m/2)]个孩子(PS:ceil为向上取整)
  • 若根结点不是叶子结点,则至少有两个孩子。
  • 所有的叶子结点都在同一层
  • 每个非叶子结点有n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1
  • 每个结点都带有完整的数据信息
生成一颗B树

这里先给大家推荐一个网站可以进行可视化的数据结构学习:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

假如我们现在要生成一颗4叉的B树,插入的数据为
1,2,3,4,5,6,7,8,9,10,11,12

  1. 插入1,2,3
    在这里插入图片描述
  2. 插入4时,由于n>3,所以中间元素2将会向上分裂到新的结点
    在这里插入图片描述
  3. 插入5,6,由于右子树的n>3,所以中间结点向上分裂
    在这里插入图片描述
  4. 看到这里大家应该已经明白了大致的插入流程,剩下的数请大家自行插入尝试,并在进行验证

B+树

在懂了B树的基础上,我们再来看B+树与B树的区别,将会非常容易理解

两者的区别
  1. n叉B+树最多包含n个指针,而n叉B树最多包含n+1个指针
  2. B+树的非叶子结点不存放具体数据,而B树所有结点都会存放数据(也就是说在B树中,只要找到了对应的数据就可以立即返回,而在B+树中,需要找到叶子结点才可以拿到对应的数据)
  3. B+树在叶子结点指向了相邻的下一个叶子结点

搭配这些概念+图片大家应该可以很快理解B+树到底是什么

这是一颗三叉B+树
在这里插入图片描述

数据库中的B+树

一般在数据库系统,或者文件系统中,都不会只是使用B+树。因为B+树也有其弊端。
普通的B+树在叶子节点中加入了顺序访问指针。

在上图中,如果我们找到了9这个结点,如果我们接下来还需要用到10,则不需要从头开始遍历,而是通过顺序访问指针直接找到10即可。

(PS:为什么B+树要添加顺序访问指针?这个跟局部性原理有关,也就是当一个数据被访问到了,那么它的相邻数据也很快会被访问到)

可是如果我们先查询10这个数据,而后想查找9呢?那我们就只能从头开始遍历这棵树找到9了。

基于这样的特性,数据库在经典的B+树中做了优化得到了叶子结点带双指针的B+树
在这里插入图片描述

到这里B树索引就基本介绍完了

由于篇幅过长,InnoDB和MyISAM会等到下一篇再讲。

如果觉得对你有一点帮助,希望你能给我点个赞或者收藏,如果有讲得不好的讲错的请指出,谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值