Btree/B+tree

B-tree

  • 什么是B-tree
    • B-tree是一种多路自平衡搜索树,它类似普通的二叉树,但是Btree允许每个节点有更多的子节点。Btree示意图如下:

在这里插入图片描述

  • 由上图可知 B-tree 的一些特点:
  1. 所有键值分布在整个树中

  2. 任何关键字出现且只出现在一个节点中

  3. 搜索有可能在非叶子节点结束

  4. 在关键字全集内做一次查找,性能逼近二分查找算法
    在这里插入图片描述
    来模拟下查找文件29的过程:

    (1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】

    (2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。

    (3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】

    (4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。

    (5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】

    (6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

  • 用途

    • 数据库中存取和查找文件(称为记录或键值)的一种方法

B+tree

B+树是B树的变体,也是一种多路平衡查找树,B+树的示意图为:
在这里插入图片描述
由图可看出B+tree的特点 同时也是 B-tree 和 B+tree的区别

  1. 所有关键字存储在叶子节点,非叶子节点不存储真正的data
  2. 为所有叶子节点增加了一个链指针
  3. 层级更低,IO 次数更少
  4. 每次都需要查询到叶子节点,查询性能稳定
  5. 叶子节点形成有序链表,范围查询方便

B-tree/B+tree区别

1、B+tree的所有关键字存储在叶子节点,非叶子节点不存储真正的data。

​ 2、B+tree为所有叶子节点增加了一个链指针。

​ 3、B+tree支持叶子节点的延展性(横向性)

为什么mysql的索引使用B+树而不是B树呢??

(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。

(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

发布了37 篇原创文章 · 获赞 7 · 访问量 1200

猜你喜欢

转载自blog.csdn.net/Hanmin_hm/article/details/104572959