Mysql为什么选择B+树作为索引结构,而不是红黑树

Mysql为什么选择B+树作为索引结构,而不是红黑树

Mysql小技巧

文章目录

  • Mysql为什么选择B+树作为索引结构,而不是红黑树
  • 前言
  • 一、B+树是什么?
  • 二、不同索引
    • 1.Hash索引
    • 2.二叉查找树
    • 3.平衡二叉树
    • 4.红黑树
    • 5.B+树
  • 总结


前言

索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
可以理解为“排好序的快速查找数据结构”

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,

这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。


一、B+树是什么?

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下:

  1. 每个结点至多有m个子女;
  2. 除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
  3. 有k个子女的结点必有k个关键字。

B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

二、不同索引

1.Hash索引

优劣势:
Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描

2.二叉查找树

二叉搜索树的英文名是Binary Search Tree,简称 BST,它是一棵二叉树,具有如下性质::

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 左、右子树也分别为二叉搜索树;
  4. 没有键值相等的节点(因此,插入的时候一定是叶子节点)。

优劣势:
解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表。

3.平衡二叉树

平衡二叉搜索树,又被称为 AVL 树,有别于AVL算法,具有以下性质:

  1. 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1;
  2. 左右两个子树也分别为一棵平衡二叉树。

优劣势:
通过旋转解决了平衡的问题,但是旋转操作效率太低。

4.红黑树

红黑树是一种自平衡的二叉搜索树,除了符合二叉搜索树的基本特性外,它还具有以下性质:

  1. 节点是红色或者黑色的;
  2. 根结点是黑色的;
  3. 每个叶子节点都是黑色的空节点( NIL 节点或者 NULL 节点);
  4. 每个红色节点的两个子节点都是黑色的,从每个叶子节点到根的所有路径上不能有两个连续的红色节点;
  5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

优劣势:
通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多。

5.B+树

优劣势:
在B树的基础上,将非叶节点改造为不存储数据纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
此外, B+树, 主要是查询效率高,O(logN),可以充分利用磁盘预读的特性,多叉树,深度小,叶子结点有序且存储数据。


总结

B+树的数据都会浓郁存储在叶子结点,而且叶子结点之间都有指针指向,这会提高范围查询的效率。
所以B+树才是最适合做查询索引的树结构。

希望这个博客能对你有所益处。我是轻王,我为自己代言。

你可能感兴趣的