众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?

先看一下B树和B+树的区别。

1.B树

维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。”

B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。

1.1定义

根节点至少有两个子节点

每个节点有M-1个key,并且以升序排列

位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间

其它节点至少有M/2个子节点

下图是一个M=4 阶的B树:

M=4的B树

可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。

B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入

6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画:

btreebuild

2.B+树

B+树是对B树的一种变形树,它与B树的差异在于:

有k个子结点的结点必然有k个关键码。

非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

如下图是一个B+树:

M=4的B+树

下图是B+树的建立过程:

Bplustreebuild.gif

B+树和B树的区别

B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

B+ 树的优点在于:

IO次数更少:由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。

遍历更加方便:B+树的叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。下面是B 树和B+树的区别图:

B树和B+树的区别图

为什么MySQL选择B+树做索引

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3、B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

4、B+树更适合基于范围的查询:B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

参考

mysql为什么不用b树_MySQL用B+树(而不是B树)做索引的原因相关推荐

  1. 二叉树、B树(B-树)、B+树、B*树详解,以及为什么MySQL选择B+树做索引

    温故而知新,可以为师矣.看到一篇介绍B数和B减树的文章,这里记录一下. 1. 简要 众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. 2. 二叉树 ...

  2. MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树

    B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...

  3. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

  4. mysql主键始终从小到大_Mysql从入门到入神之(四)B+树索引

    前言 文本已收录至个人GitHub仓库,欢迎Star:github.com/bin39232820- 种一棵树最好的时间是十年前,其次是如今 我知道不少人不玩qq了,可是怀旧一下,欢迎加入六脉神剑Ja ...

  5. mysql 联合索 B 树_MySQL 索引与 B+ 树

    MySQL 索引与 B+ 树 B+ 树 MySQL Innodb 存储引擎是使用 B+ 树来组织索引的.在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡 ...

  6. mysql b 树 b树_MySQL B树和B+树的区别

    B树是一种多路平衡的查找树,它的每个节点最多包含k个孩子,k被称为B树的阶,k的大小取决于磁盘页的大小. B树具有以下的特征: [if !supportLists]1.[endif]根结点至少有2个子 ...

  7. MySQL为啥不用平衡二叉树_MySQL的索引,为什么是B+而不是平衡二叉树

    数据库为什么使用B+树? 前言 讲到索引,第一反应肯定是能提高查询效率.例如书的目录,想要查找某一章节,会先从目录中定位.如果没有目录,那么就需要将所有内容都看一遍才能找到. 索引的设计对程序的性能至 ...

  8. mysql数据库设计与应用答案智慧树_知到智慧树_MySQL数据库设计与应用_答案完整...

    知到智慧树_MySQL数据库设计与应用_答案完整 更多相关问题 [B11]A.carry onB.linger onC.set inD.log in 数据库的三级模式结构中,模式也称为A.逻辑模式B. ...

  9. mysql函数包含的意思_MySQL存储函数的特性说明中,______表示函数体不包含SQL语句。-智慧树MySQL数据库设计与应用章节答案...

    MySQL数据库设计与应用:MySQL存储函数的特性说明中,______表示函数体不包含SQL语句.[?????] A:containssql B:modifiessqldata C:nosql D: ...

最新文章

  1. 【python】使用python脚本将CelebA中图片按照 list_attr_celeba.txt 中属性处理(删除、复制、移动)
  2. 拥有“上帝视角”是怎样的体验?高分多模卫星首批影像成果发布
  3. 【UI】android如何绘制一个饼图
  4. 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑
  5. 当代成年人的生活状态......
  6. C++输入输出:cin/cout 还是 scanf/printf?
  7. vue 后台数据列表获取图片_vue使用ajax获取后台数据进行显示的示例
  8. [K/3Cloud]如何解决kdpkg无法部署到业务站点的问题
  9. linux netstat
  10. 福气太薄,刚积攒了点又被自己扔了
  11. php用putty安装吗,为什么通过Putty的SSH命令与PHP的phpseclib不同?
  12. Java到底能做什么事情呢?
  13. thinkpkp typecho maccms 全站加密不改动源码方法,多数php程序通用
  14. 遇见未来 | 对话叶毓睿:人类文明运行在软件之上(下篇)
  15. Windows 10日语输入法无法输入假名问题
  16. mysql导入.idb文件进行修复数据库
  17. Compose系列 五 副作用 side-effect
  18. excel表格打印每页都有表头_分享|1分钟学会,让打印的表格每页自带标题行
  19. php网站制作(6)-php 学习摘记
  20. 针对开放平台的架构理解

热门文章

  1. 为什么学习Vue框架??
  2. 如何绘制业务流程图?
  3. CSCD.中国科学引文数据库核心库和引文库来源期刊列表(2007年-2008年)
  4. Pytorch警告UserWarning: Loky-backed parallel loops cannot be called in a multiprocessing
  5. 无限纷争怎么看以前的服务器,无限纷争怎么切换角色 无限纷争切换角色方法...
  6. 这156套PS笔刷合集!两天时间给大家盘来了!
  7. 数学建模 之 ARCH模型和GARCH模型
  8. 网易2019实习生招聘算法题(一)
  9. 牛牛的闹钟--网易2019实习生招聘编程题
  10. github如何写博客