最通俗易懂的MYSQL索引原理

MYSQL的存储索引的原理是面试中出现频率很高的问题了,这篇文章就做一个总结。

首先MYSQL的两个搜索引擎InnoDB和MyISAM里面的索引用到的数据结构都是B+树,然后问题就来了,为什么不用二叉搜索树、二叉平衡树、红黑树、B-树来作为索引的基本结构呢?网上有很多关于这个问题的回答,但是很乱,所以我在此总结。
首先我们要知道建立索引的目的是什么?目的就是为了在尽可能地减少磁盘IO的次数的前提下,快速地找到需要获取的数据。
在这里,我们要提到的就是磁盘IO的特性,磁盘IO就是每一次都把当前磁盘地址的数据加载到内存,每次IO读取的数据我们称为一页(page)。一页的内存大小与实际使用的操作系统相关,一般为4K或者8K,这就意味着,读取一页数据的时候,实际上就发生了一次磁盘IO。
好,到了这里,我们就开始根据每个数据结构的特性来分析。

二叉搜索树

首先是二叉树,我们都知道二叉树是一个父节点下面有两个子节点。二叉搜索树在最理想的情况下,也就是理想的满二叉树,它的搜索时间复杂度是O(logn),但是在某些极端的情况下,比如只有左子树,或者只有右子树的情况下,搜索的效率就会退化到链表的搜索效率也就是O(n),显然二叉搜索树不够稳定。

二叉平衡树

通过二叉搜索树,我们了解到满二叉树的时间复杂度是O(logn),这也就是平衡树的时间复杂度。二叉平衡树的特点是左右子树的高度相差不超过1,为了达到这个目的,在插入数据的时候,平衡树需要额外地增加旋转的操作来保持这个平衡。但是总的来说,它的时间复杂度是O(logn)。就是额外的旋转操作耗费了一定的时间。

红黑树

红黑树与平衡二叉树有一些相似,性能也十分稳定,时间复杂度保持在O(logn),在java中也有用到红黑树的数据结构,比如java里面的HashMap、TreeMap。

总的来说

总的来说,平衡树、红黑树的性能其实都挺稳定的,虽然旋转操作需要耗费一定的时间,但是时间复杂度稳定在O(logn)。那么为什么MYSQL不用这些作为基本的结构去建立索引呢?原因就是我们不仅需要考虑到数据结构本身的时间复杂度,还需要考虑到磁盘的IO消耗。因为磁盘IO次数与树高相关。如果树太高,每遍历一层结点时(也就是每访问一次节点),就需要从磁盘读取一次数据,也就是发生一次 IO,如果树高20,那么就需要20次的IO,这对MYSQL来说,是灾难性的。所以需要用多叉树来做这个事情,也就讲到了B-树、B+树。

B-树与B+树

B-树与B+树的一个最大的区别就是B+树只有叶子节点才保存data域的数据。下面这两张图很好地说明了这个。
这是B-树的内部结构,可以看到它除了叶子节点之外,其他的节点也存有真实的data域数据。
B-树这是B+树的内部结构,可以看到,它只有叶子节点才存放data域数据,其他节点存放的都只是索引值。
B+树接下来就是对比B-树与B+树,之前有提到磁盘一次读取的数据为一页,(这里请一定要参照上面的这两个图)在内存一定的情况下,B+树能保存更多的索引节点,可以让树的每个结点尽可能多的拥有多个子结点这样的话,也就是一次访问,B+能访问到更多的索引值,提高了效率,在大量储存数据时,树高就低很多了(因为把索引节点都尽可能放到了同一内存中,最大效率地保存所有的索引节点,data域的数据就放在最下面那层就可以了),减少了磁盘的IO次数,这样就提高了索引查询的效率。所以最终选择的是B+树。

如果对你有帮助,请点赞收藏噢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值