数据结构 -- 数据库的索引为什么要用B树或者B+树

1、数据库索引

  • 数据库的索引可以提高我们的查询速度,是存储在磁盘上的,但当数据量很大的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的时候,能把整个索引都加载到内存吗?显然是不可以的,能做的就是一次一次的加载磁盘页,这里的磁盘对应着所引述的节点。
  • 索引树

在这里插入图片描述

  • 磁盘页
    在这里插入图片描述
  • 如果索引采用二叉排序树,那么IO的最多次数就是取决于这个树的高度。
    在这里插入图片描述

2、B树比二叉排序树快的原因

  • B树是一个多路平衡查找树,它的每一个节点最多包含k个孩子,因此k被称作B树的阶,k的大小取决于磁盘页的大小。
  • 一个m阶B树的定义如下
  • 1.根结点至少有两个子女。
  • 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
  • 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
  • 4.所有的叶子结点都位于同一层。
  • 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
    在这里插入图片描述
  • 当查找某一个元素的时候,这个元素在二叉排序树上必须一个节点一个节点的比较。IO的次数与比较次数的相同的。而在B树中,每一个方块都会被家在今内存。例如,当查找5的时候,5先与9比较,第一次IO,然后走左分支,然后进入第二个方块,由于方块在内存中,所以与2和6的比较就在内存中比较了,而内存要比IO快10000倍左右。下面也是同理,这就提升了整个的查询速度,实际上就是减少IO的操作,访问磁盘。而平衡二叉树就是一直在IO。

3、B+树

  • 除了具备B树的五条特征之外,还包含如下特征:
  • 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
  • 2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  • 3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
    在这里插入图片描述
  • 这里面的根节点8是左分支最大的,15是右分支最大的
  • 同时每一个节点都带有指向下一个节点的指针,形成了有序链表。
  • B-树的中间节点和叶子节点都带有卫星数据(数据记录)
    在这里插入图片描述
  • 但是在B+树,只有叶子节点带有卫星数据,其余中间节点仅仅是索引。没有任何关联数据
    在这里插入图片描述
    需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

B+树比B树性能优越在哪?

  • 首先在B+树的中间节点中不含有卫星数据,这里就能放置更多的节点,只放索引,所以同样大小的磁盘,可以容纳更多的节点元素。这就意味着相同数据量的情况下,B+树比B树更加矮胖,因此查询的IO次数也就更少。
  • 其次B+树查找的查询必须要找到叶子节点,而B树可以找到中间节点也可以找到叶子节点,相比之下B+树的性能更加稳定。
  • 最后一点是查询范围时,更加方便。如果是B树根据中序遍历只能一点一点的找到。而对于B+树之间有指针可以直接找到。
    在这里插入图片描述
    总结:B+树比B树更优越的原因有三点:1、单一节点存储更多的元素,使得查询的IO次数更少,2、所有查询都要查找到叶子节点,查询性能稳定。3、所有叶子节点形成有序链表,便于范围查询
发布了134 篇原创文章 · 获赞 91 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_44588495/article/details/102846567