mysql 为什么使用b+树作为索引的结构

mysql 为什么使用b+树作为索引的结构

一 B树的特性

    1.关键字分布再整棵树的所有节点
    2.任何一个关键字出现且只出现在一个节点中。
    3.搜索有可能在非叶子节点结束.
    4.其搜索性能等价于再关键字全集内做一次二分查找

二 B+树的特性(B+树是B树的一种变形树 可以解决某些问题)

    1.所有关键字都出现在叶子节点的链表中,且链表中的关键字是有序的。
    2.搜索只在叶子节点命中
    3.非叶子节点相当于是叶子节点的索引,叶子节点是存储关键字数据的数据层


三 红黑树或者平衡二叉树的其他树结构,

    1.h明显要深的多,执行效率低
    2.逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,
    3.每个节点存储的数据量太小了,对磁盘空间造成浪费,带来频繁的IO操作。

    所以其他树结构的效率明显比B树差很多。

 
四 数据库索引的b+数与B树的差异总结

  1.非叶子节点的子树指针与关键字个数相同
  2.非叶子节点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树(注意,区间是前闭后开)。
  3.为所有叶子节点增加可一个连指针
  4.所有关键字都在叶子节点出现。


五 B树和B+树适合做索引的原因
1.局部性原理与磁盘预读
    由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分之一,因此为了提高效率,要尽量减少磁盘I/O。 为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:


       当一个数据被用到时,其附近的数据也通常会马上被使用——程序运行期间所需要的数据通常比较集中。


    由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。
    预读的长度一般为页的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

    一般来说,磁盘I/O次数可以用于评价索引结构的优劣,数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。

2. 每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个节点只需一次I/O。
3. B树中一次检索最多需要h-1次I/O(根节点常驻内存)。一般实际应用中,出度d(树的分叉数)是非常大的数字,通常超过100;h非常小,通常不超过3。

相对B树,B+树做索引的优势(mysql 选择b+树作为索引的原因)
1.B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针(指向了关键字),因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。(B+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;)
2.B+树的查询效率更加稳定:由于所有数据都存于叶子节点。所有关键字查询的路径长度相同,每一个数据的查询效率相当。(查询效率稳定、并不慢)
3.B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,b树需要重复地中序遍历,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。(主要原因吧  并且对精典B+树做了优化增加了顺序访问指针。)


MongoDB的索引为什么选择B树,而Mysql的索引是B+树
MongoDB不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,所以范围查询和遍历查询的需求就没那么强烈了,其次Mysql由于使用B+树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问。
总体来说,Mysql选用B+树和MongoDB选用B-树还是以自己的需求来选择的。

 

参考链接  https://blog.csdn.net/login_sonata/article/details/75268075

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值