为什么MyisAM与InnodDB底层采用B+树做索引

1.为什么不是二叉树、红黑树什么的呢?

首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上。然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作。

而二叉树这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少。

2.为什么是B+树而不是B树呢?

(1)单一节点存储更多的元素(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。

B+树真正的数据都存在叶子结点嘛,也就是上面的结点就简单的索引,就内存会更小,意味着同样的一个页内存大小,所以B+树中,同样的磁盘页大小可以装更多个“索引”,也就是在同样的数据量的情况下,B+树会比B树更加矮胖,因此查询时IO的次数也更加少。

另外,引一点题外话,阶数越大,B树的内存浪费越严重(因为它每个节点的data数据域和sub指针域都有M+1个元素,当该节点只存储了一部分元素时,其他空间都被浪费了),而B+树由于它层数一般在2~4层,所以相对于B树,内存浪费相对较少一点。

(2) 所有查询都要查找到叶子节点,查询性能稳定。

B+树的查询必须查到叶子结点,因为它真正的数据都在叶子嘛,而B树不是,B树只要匹配到那个索引data就好,无论它是在中间结点还是叶子结点,因此B树的查询不是稳定的,最好的情况是只找根节点就行,最坏的情况是找到叶子结点,而B+树的每次查找都是稳定的。

(3)所有叶子节点形成有序链表,便于范围查询。

B树的范围查询十分麻烦,B+树的范围查询只需要在最下面的叶子结点的链表中做遍历就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值