跳到主要内容

B 树与 B+ 树

B树

  • 每个节点对多 m-1 个关键字
  • 根节点最少可以只有 1 个关键字
  • 非根节点至少有 m/2 个关键字
  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  • 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。
  • 每个节点都存有索引和数据,也就是对应的 key 和 value。

B+树

  • 根节点至少一个元素
  • 非根节点元素范围:m/2 <= k <= m-1
  • 非叶子节点不存储数据,只存储索引,数据都存储在叶子节点。
  • 对于一个非叶子节点,左子树的 key 都小于它,右子树的 key 都大于它。
  • 每个叶子节点都存有相邻叶子节点的指针,叶子节点本身依赖关键字的大小顺序连接。
  • 父节点存有所有子树第一个元素的索引。

B树和B+树的区别

  1. B 树的每个节点都存储数据,B+ 树非叶子节点存索引,叶子节点存数据。
  2. B 树的叶子节点不一定在同一层,B+ 树的叶子节点都在同一层,通过链表连接。
  3. B 树的所有节点的 key 不重复,而 B+ 树的叶子节点的 key 可以重复。

MySQL 为什么选择 B+ 树

  1. 相对于 B 数据来说,因为非叶子节点不存储数据,就能够存储更多的索引了,可以使 B+ 树的高度比 B树低,减少 I/O 次数。
  2. B+ 树的所有叶子节点都是通过指针相连的,顺序遍历和范围查询很便利。