介绍下B树和B+树

B树

b树是一种平衡多路查找树、相比平衡二叉树它一个节点可以存多个元素、一棵m(m是指一个节点最多有几个子节点)阶的B 树有以下特性:

  1. 树中根节点若不是子树、必须至少有两个子节点。
  2. 除根节点和叶子结点其他结点至少有[ceil(m/2)](向上取整、比如m=5,就至少有3个子节点)个节点。
  3. 节点存储的元素的个数范围是 [ceil(m / 2)-1]<= n <= m-1个
  4. B树叶子结点不包含任何元素、也就是null(为空的目的是查到叶子结点表示没有找到返回null)
B+树

B+树是B树的加强版、B+树与B树的差异在于

  • 所有的数据全部存储在叶子节点上,且叶子节点本身根据关键字自小而大顺序连接
  • 非叶子节点相当于叶子节点的索引,叶子节点相当于是存储(关键字)数据的数据层。
  • 叶子节点会有指针指向下一个节点。方便于范围查找

为什么索引使用B+树、而不是B树?或者其他红黑树,二叉树

在mysql中数据是通过文件保存在磁盘的、所以在查询数据库时我们要去访问数据库文件、访问磁盘上的文件就要进行磁盘上的IO操作,磁盘上的IO操作相比内存上的IO操作存在机械远动、所以磁盘IO操作是相当费时间的。

B树B+树相比其他树

假设我们使用红黑树保存数据、一个节点只能存一个数据、这样会导致树的高度会大、在进行读取元素时会进行大量的频繁的IO操作会导致访问性能非常低。
B+和B树是一种一个节点可存成千上万个数据的平衡多路查找树、可以极大的降低高度、根据磁盘查找存取的次数往往由树的高度所决定、B树和B+树大大提高了查询的效率。

B+树相比B树

而B+树相对于B树来说、B + 树只有叶节点存放数据,其余节点用来索引,而 B 树是每个索引节点都会 有 Data 域。这无疑增大了节点大小,指针少的情况下要保存大量数据,只能增加树的高度,导致 IO 操作变多,查询性能变低,而 B + 树除了叶子节点其它节点并不存储数据,节点小,磁盘 IO 次数就少。这是优点之一。

另一方面B + 树所有的 Data 域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。在数据库中基于范围的查询是非常频繁的,而 B 树不支持这样的遍历操作。

总结一下:
使用B+树而不是B树的原因B+树节点大小更小,一次IO读入的节点数更多B+树的数据都在叶子节点中,遍历和区间访问性能大幅提高B+树查询效率稳定
使用B+树而不是AVL树、红黑树的原因B+树的树高比AVL树、红黑树低,IO次数少

参考博文

MySQL索引底层实现原理
为什么 Mysql 用 B + 树做索引而不用 B 树或红黑树
为什么MySQL索引要用B+树,而不是B树?
从B树、B+树、B*树谈到R 树

总结

文章是参考多篇博客总结而成、主要是用于面试回答。想详细了解可以看下我外链的参考博文。

面试题-为什么索引使用B+树、而不是B树?或者其他红黑树,二叉树相关推荐

  1. MySQL面试:索引为啥使用B+树而不是B树

    索引的本质 数据库索引,就是数据库管理系统(DBMS)中一个排序的数据结构,用以协助快速查询,更新数据库表中数据 首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址.如果没有索引的话, ...

  2. 储存引擎InnoDB 索引选择 为何是B+树 而不是 B树 哈希表

    一:概述 首先需要澄清的一点是,MySQL 跟 B+ 树没有直接的关系,真正与 B+ 树有关系的是 MySQL 的默认存储引擎 InnoDB,MySQL 中存储引擎的主要作用是负责数据的存储和提取,除 ...

  3. mysql为什么不用b树_MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. 1.B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结 ...

  4. 数据库为什么使用B+树而不是B树

    B树和B+树的区别主要有两点: 在B树中,你可以将键和值存放在内部节点和叶子节点,但在B+树中,内部节点都是键,没有值.叶子节点同时存放键和值 B+树的叶子节点有一条链相连,而B+树的叶子节点各自独立 ...

  5. 2020最新MySQL数据库面试题( MySQL引索系统+MySQL数据架构+红黑树结构图+B+树)

    视频参考一线互联网大佬一堂课教会你那些年,你未曾了解的MySQL索引优化 [建议收藏] '阿里高级架构师一个视频教会你MySql 各大知识点MySQL系列/ MySQL引索系统/MySQL数据架构/红 ...

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

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

  7. 二叉排序树、平衡二叉树、红黑树、B树、B+树

    全民制作人们,大家好.我是练习时长两天半的个人练习册,喜欢B树 ,B+树, BST树, AVL树,来 red black  ~ 目录 一.二叉排序树(BST树) 1.1二叉排序树的定义 1.2二叉排序 ...

  8. Linux内核之于红黑树and AVL树

    为什么Linux早先使用AVL树而后来倾向于红黑树?        实际上这是由红黑树的实用主义特质导致的结果,本短文依然是形而上的观点.红黑树可以直接由2-3树导出,我们可以不再提红黑树,而只提2- ...

  9. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树

    B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...

  10. 平衡二叉树(AVL树)和红黑树区别

    1.二叉搜索树,平衡二叉树,红黑树的算法效率 操作 二叉查找树 平衡二叉树 红黑树 查找 O(n) O(logn) O(log2 n) 插入 O(n) O(logn) O(log2 n) 删除 O(n ...

最新文章

  1. 如何从0写一个服务网关?
  2. 每日一皮:完美的结对编程!
  3. CSDN Markdown 博客如何设置插入代码背景颜色(设置成黑色)?
  4. go语言中goroutine池
  5. mysql sqlite 分页查询_php基于SQLite实现的分页功能示例
  6. 【Java静态代理】以模拟“婚庆公司帮助你嫦娥奔月”为例
  7. antd 日期时间选择_Excel最全时间类函数总结,有必要收藏一下哦
  8. glyphicons-halflings-regular.woff2 文件 404
  9. 01.J2EE开发环境搭建
  10. OSPF沉默接口配置
  11. 倍数(Python)
  12. cadence 通孔焊盘_Allegro 16.6创建通孔类焊盘步骤
  13. 强生单剂新冠疫苗对“德尔塔”有效;赛诺菲巴斯德将每年投资4亿欧元建mRNA疫苗中心 | 美通社头条...
  14. 一篇很完整的元器件选型指南
  15. AVFrame相关api内存管理
  16. android speex AEC 回音消除
  17. 在Windows下正确地编译最新的pytorch和tensorflow
  18. 基于单片机的宠物定时喂食器设计
  19. ffmpeg录制桌面(队列方式)
  20. FineUI(专业版)v3.2.0 发布(ASP.NET UI控件库)!

热门文章

  1. linux+nginx+tomcat负载均衡,实现session同步
  2. WINDOWS2003超级作用域
  3. 再暴BBSxp 7.0 Beta 2漏洞
  4. 9.这就是搜索引擎:核心技术详解 --- 用户查询意图分析
  5. 7.深入分布式缓存:从原理到实践 --- Redis探秘
  6. 11.卷1(套接字联网API)---名字与地址转换
  7. 6.Composer实现PHP中类的自动加载
  8. 1. PHP 设计模式---工厂模式
  9. masql redis
  10. SQL查看存储过程相关信息