MySQL 二叉树 AVL树 红黑树 B-树 B+树 B*树

二叉树

  • 一个节点最多只有两个子节点
  • 树的层级结构比较深
  • 左右两边数据层级不一致,查询的层级数量不稳定
    在这里插入图片描述

平衡二叉树 (AVL)

  • 一个节点最多只有两个子节点
  • 左右两边层级深度差不能大于1
  • 数据量大时,树的层级比较深
  • 插入 删除 的效率低,查询效率高
    在这里插入图片描述

红黑树 (red / black tree)

  • 旋转 + 变色
  • 左右两边最长深部不能大于最短深度的两边
  • 一条链中不能出现两个相连的红色
  • 一个节点中的两个链中黑色节点是一样的
  • AVL树的一个升级,提升了增删的效率
    在这里插入图片描述

左旋 右旋

在这里插入图片描述

B树

  • 每一个节点都保存数据
  • 树的层级数量可以指定
  • 每一个节点可以保存4K的倍数数据集(不单单指保存一个值)
    • 预读的概念
  • 由于每一个节点都保存数据,导致节点保存的数据量有限

比如一个节点保存16K数据,每一个数据大小为1K,那一个节点只能保存16个值
如果树有三层,每一个节点保存16个数据,三次IO最多保存161616 (4096个) 数据
因为存储的数据量太少,所以有了B+树

在这里插入图片描述

B+树

  • 只有子节点才保存数据
  • 所以相同的IO次数下,跟B-树相比,可以保存更多的数据
    在这里插入图片描述

B* 树

  • 每一个非子节点保存了下一个非子节点的地址
  • B*树插入时,当一个节点满时,如果它的下一个兄弟节点未满,那么将一部分数据移到兄弟节点中,再在原节点插入关键字,最后修改父节点中兄弟节点的关键字(因为兄弟节点的关键字范围改变了)。如果兄弟节点满了,则在原节点与兄弟节点之间增加新节点,并各复制1/3的数据到新节点,最后在父节点增加新节点的指针。
  • 由于MySQL B+树非子节点不保存数据,所以没使用
    在这里插入图片描述