mysql的Innodb为什么使用B+树

不同数据结构的优缺点

hash:查找快,但是不适合范围查找

有序数组:查找和范围查找都很快,但是插入就需要移动之后的所有数据

二叉树:二分查找法,会有左倾或者右倾的情况,且不适合做范围查询

平衡二叉树:避免的左倾和右倾,但是数据量大的时候,树高会很高,也就是IO次数会很多

B-Tree:相比平衡二叉树,树高是降低了,但是还是不适合范围查询,范围查询需要遍历所有数据

B+Tree:将所有数据都放到叶子节点,且叶子节点形成一个列表(可以做范围查询),非叶子节点只放键值,每个数据叶中的有效数据就多了,可以减少IO次数。

N叉树的N能调整吗?

​ N和数据页大小和key大小有关,我们可以调整数据页的大小,也可以调整key的大小,比如将普通索引设置为前缀索引。

数据页内部是一个有序数组,通过二分法查找

为什么B+树比B树更适合做索引

 B树也是多叉树结构,一种自平衡的树,而且B+树是从B树演化而来的,那么为什么不使用B+树的前身B树呢?从结构比较来看,B树相比B+树的一个主要区别就在于B树的分支节点上存储着数据,而B+树的分支节点只是叶子节点的索引而已。根据这个差别可以得出以下结论:

  • 磁盘IO读写次数相比B树降低了
      在B+树中,其非叶子的内部节点都变成了key值,因此其内部节点相对B 树更小。如果把所有同一内部节点的key存放在同一盘块中,那么盘块所能容纳的key数量也越多。一次性读内存中的需要查找的key值也就越多。相对来说IO读写次数也就降低了。
  • 每次查询的时间复杂度是固定的
      在B+树中,由于分支节点只是叶子节点的索引,所以对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每次查询的时间复杂度是固定的。但是在B树中,其分支节点上也保存有数据,对于每一个数据的查询所走的路径长度是不一样的,所以查询效率也不一样。
  • 遍历效率更高
      由于B+树的数据都存储在叶子节点上,分支节点均为索引,方便扫库,只需扫一遍叶子即可。但是B树在分支节点上都保存着数据,要找到具体的顺序数据,需要执行一次中序遍历来查找。所以B+树更加适合范围查询的情况,在解决磁盘IO性能的同时解决了B树元素遍历效率低下的问题。
  • 因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

猜你喜欢

转载自blog.csdn.net/weichi7549/article/details/108179677