Mysql之为什么索引的底层数据结构是B+Tree

目录

一、什么是索引

二、为什么要使用索引(索引的优缺点)

三、mysql中存储索引的底层数据结构为什么是B+Tree


一、什么是索引

(1)MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

(2)通俗一点说,可以将索引理解为一本书的目录,当我们到一本书中去查找相关内容时,通过目录查找对应标题内容,再找到对应页码,最后便可直接定位到我们需要查阅的内容啦。

二、为什么要使用索引

使用索引的目的是为了加快数据库的查询速度,降低程序的响应时长。

但是也不是非要使用索引不可,当数据量较少时,查询速度已经十分迅速,此时便不需要使用索引。但当数据量达到一定量时,若没有索引,便可能导致查询响应十分缓慢,严重影响查询效率。

因此索引并不是非建不可,但不建可能导致的问题也可大可小,这个要结合到实际的业务进行充分考虑。下面我们就索引的优缺点进行简单说明:

使用索引的优点提升查询速度

1.通过创建唯一索引,可以保证数据库每一行数据的唯一性

2.减少磁盘IO,可以大大提高查询速度

3.可以加速表与表的连接

4.根据索引进行分组和排序,可以显著的减少查询中分组和排序的时间。

使用索引的缺维护效率低

1.创建索引和维护索引需要时间,而且数据量越大时间越长

2.创建索引需要占据磁盘的空间,如果有大量的索引,可能比数据文件更快达到最大文件尺寸,一般来说,索引表占用的空间为数据表的1.5倍

3.当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护速度

三、mysql中存储索引的底层数据结构的选择

索引的类型有很多种,比如hash索引,BTree索引,全文索引等等,其实不管什么类型,都是为了在特定业务场景下方便快速查找数据的算法。

那么Mysql中的索引是什么类型的呢?

接下来,我们将对Hash,二叉树,红黑树,BTree以及B+Tree这几种数据结构,进行分析,最终选出最适宜Mysql索引底层的数据结构。

(1)Hash

Hash是一种Key-Value形式的索引类型,和咱们平时查阅书籍,根据标题(Key)查找对应内容页码(Value)的方式非常类似。这种数据结构的思想非常简单,也非常实用,但如果需要进行范围查找时,就需要遍历进行查找了,因此并不适宜作为Mysql索引的底层数据结构。

实用Hash作为索引底层数据结构的缺点:

1、如果利用hash存储的话需要将所有的数据文件添加到内存,比较耗费内存空间

2、如果所有的查询都是等值查询,那么hash确实很快,但是在企业或者实际工作环境中范围查找的数据更多,而不是等值查询,因此hash就不太适合了

(2)树

对于树的概念及分类,默认读者已清晰各种树的特征,若不清晰,则推荐先查阅树的相关资料。

基于树,我们可以选取以下几种特殊结构的树来进行索引的存储,但都会存在这样或者那样的问题,以下将分类进行简单说明;

(2-1)二叉树

       如果采用二叉树,则有可能因为数据的线性增长,树结构退化为一个有n个节点的线性链,查询数据时的IO次数也随之增加,查询效率低。

(2-2)AVL树(平衡二叉树)

        如果采用AVL树(平衡二叉树),由于平衡二叉树为了保证树结构的平衡,因此每次新增或删减数据时,都有可能出发节点旋转以维持平衡,节点的旋转是一个非常耗时的过程,平衡树本身也是更适用于查找情况较多,但增删次数较少的情况,这对于数据库而言是不太适宜的。

(2-3)红黑树

        红黑树是树结构的另一种变种,红黑树相对于平衡二叉树而言,对于树结构的平衡性要求上有所降低,红黑树要求从根节点到叶子节点间的最短路径与最长路径不超过2倍,用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,红黑树的查询性能略微逊色于AVL树,因为比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较,但是,红黑树在插入和删除上完爆AVL树,AVL树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于AVL树为了维持平衡的开销要小得多。

        红黑树多用于搜索,插入,删除操作多的情况下

       对于上述的三种树结构,无论是二叉树、AVL树,或者是红黑树,都会因为树的深度过深而造成io次数变多,影响数据读取的效率,这也是不选取这三种数据结构作为数据库索引的重要原因。

(2-4)B-树(B-Tree):

       B-树就是B树,-只是一个符号.
       B树(B-Tree)是一种自平衡的树,它是一种多路搜索树(并不是二叉的),能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)。

      B-Tree数据结构的特点:

1、所有键值分布在整颗树中

2、搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找

3、每个节点最多拥有m个子树

4、根节点至少有2个子树

5、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)

6、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列

    图示:下图展示了一个B-Tree中的结构:

图示说明:

每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为 16 和 34,P1 指针指向的子树的数据范围为小于 16,P2 指针指向的子树的数据范围为 16~34,P3 指针指向的子树的数据范围为大于 34。 

查找关键字过程:如查找28关键字的过程:

1、根据根节点找到磁盘块:
(1)读入内存。【磁盘 I/O 操作第 1 次】

(2)比较关键字 28 在区间(16,34),找到磁盘块 1 的指针 P2。

(3)根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】

(4)比较关键字 28 在区间(25,31),找到磁盘块 3 的指针 P2。

(5)根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】

(6)在磁盘块 8 中的关键字列表中找到关键字 28。 

B-Tree的缺点:

1、每个节点都有key,同时也包含data,而每个页存储空间是有限的,如果data比较大的话会导致每个节点存储的key数量变小

2、当存储的数据量很大的时候会导致深度较大,增大查询时磁盘io次数,进而影响查询性能

(2-5)B+树(B+Tree):

        B+树是B-树的变体,也是一种多路搜索树
        B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+Tree的特点:

1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的
2.不可能在非叶子结点命中
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
4.更适合文件索引系统

原因: 增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率

图示:

图示说明:

1.除了叶子节点外,其他节点存储的均为地址及索引值,不存储相关数据

2.所有数据均存储于叶子节点,有序且是双向链表结构

B+Tree的优点:

1.层级更低,IO 次数更少
2.每次都需要查询到叶子节点,查询性能稳定
3.叶子节点形成有序链表,范围查询方便

对比B-Tree与B+Tree:

B树:有序数组+平衡多叉树
B+树:有序数组链表+平衡多叉树

扫库时,B-Tree必须用中序遍历的方法进行扫库,而B+Tree可以直接按照叶子结点挨个扫一遍就可以了。同时,要进行范围查找时,B-Tree查起来非常麻烦,因为每个节点上都存在数据,但是B+Tree则直接可以查处两个节点信息,然后串起来就行啦,这也是数据库索引选择使用B+Tree而不是B-Tree的重要原因。、

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值