首先,我们应该考虑一个问题,数据库在磁盘中是怎样存储的?(答案写在下一篇文章中)

  b树、b+树、AVL树、红黑树的区别很大。虽然都可以提高搜索性能,但是作用方式不同。

  通常文件和数据库都存储在磁盘,如果数据量大,不一定能全部加载到内存,因此使用b树,一次只加载少量节点数据。其次,b树是多路搜索树,M路的B树最多有M个子节点,通过多路搜索,降低了树的高度,从而在避免内存溢出的情况下减少了内存与磁盘的IO次数,提升了搜索性能。

  但是使用b树,数据存储在每一个节点中,搜索时会做局部中序遍历,如果查询多条数据,即需要跨层访问,仍然对搜索效率有不利影响,因此推出b+树,b+树由于所有数据存储在叶子节点,索引存储在非叶子节点中,因此不存在跨层访问,同时叶子节点之间连接成链,搜索时只需找到首尾即可取得所需数据。因此在Innodb中使用了性能更佳的b+树。

  AVL树和红黑树却是平衡二叉树,但是红黑树并不是严格意义的平衡树,AVL树要求必须满足所有节点左右子树高度差不超过1,红黑树却要求必须满足没有一条路径比其他路径长出两倍。红黑树如何实现这一性质呢?很简单,通过对节点颜色的控制实现,即要求

  (1)根节点必须是黑色

  (2)叶子节点(Nil)必须是黑色

  (3)红色节点的两个子节点必须是黑色

  (4)任意节点到每个叶子节点路径包含相同数量的黑节点(最重要)

  红黑树相较于AVL树来说,对平衡要求的宽松,大大减少了旋转带来的耗时问题,平衡树旋转是很耗时的,因此,在内存中使用红黑树效率高,如hashmap等。

  既然红黑树搜索效率也高,为什么数据库使用b+树,这是因为红黑树仍然是一棵二叉树,相同数量的节点,红黑树更深,不适用与磁盘的IO。