B树

B树是一种多路自平衡搜索树,它类似普通的二叉树,但是B书允许每个节点有更多的子节点。B树示意图如下:

B树的特点:
(1)所有键值分布在整个树中
(2)任何关键字出现且只出现在一个节点中
(3)搜索有可能在非叶子节点结束
(4)在关键字全集内做一次查找,性能逼近二分查找算法

3:所有叶子节点都出现在同一层,且叶子节点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null)
4:每个非叶子节点包含有n个关键字信息(n,P0,K1,P1,K2,P2,......,Kn,Pn),其中:
a) Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
b) Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
c) 关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。
这三天摘抄自文末参考,大致理解一下就行。

来模拟下查找文件29的过程:

(1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】

(2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。

(3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】

(4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。

(5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】

(6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。

B+Tree

从图中也可以看到,B+树与B树的不同在于:
(1)所有关键字存储在叶子节点,非叶子节点不存储真正的data
(2)为所有叶子节点增加了一个链指针

那么问题来了,为什么用B/B+树这种结构来实现索引呢??
答:红黑树等结构也可以用来实现索引,但是文件系统及数据库系统普遍使用B/B+树结构来实现索引。mysql是基于磁盘的数据库,索引是以索引文件的形式存在于磁盘中的,索引的查找过程就会涉及到磁盘IO(为什么涉及到磁盘IO请看文章后面的附加理解部分)消耗,磁盘IO的消耗相比较于内存IO的消耗要高好几个数量级,所以索引的组织结构要设计得在查找关键字时要尽量减少磁盘IO的次数。为什么要使用B/B+树,跟磁盘的存储原理有关。

局部性原理与磁盘预读
为了提升效率,要尽量减少磁盘IO的次数。实际过程中,磁盘并不是每次严格按需读取,而是每次都会预读。磁盘读取完需要的数据后,会按顺序再多读一部分数据到内存中,这样做的理论依据是计算机科学中注明的局部性原理:

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

(1)由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),
因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。
(2)MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K(这个值可以修改)。linux 默认页大小为4K。

B-Tree借助计算机磁盘预读的机制,并使用如下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个结点只需一次I/O。
假设 B-Tree 的高度为 h,B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3,也即索引的B+树层次一般不超过三层,所以查找效率很高)。
而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

为什么mysql的索引使用B+树而不是B树呢??
(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

原文:https://www.jianshu.com/p/0371c9569736

Btree和B+tree的区别相关推荐

  1. 带父节点的平衡二叉树_深入理解(二叉树、平衡二叉树、B-Tree、B+Tree )的区别

    一.背景 一般说MySQL的索引,都清楚其索引主要以B+树为主,此外还有Hash.RTree.FullText.本文简要说明一下MySQL的B+Tree索引,以及和其相关的二叉树.平衡二叉树.B-Tr ...

  2. 你还不知道 BTree,B-Tree,B+Tree 的区别吗?

    文章目录 前言 BTree B+Tree BTree 与 B+Tree 前言 关于MySQL的系列文章,请跳转至 MySQL专栏 今天来总结一下,B树.B-树.B+树,这三棵树.对于 B树和B-树,网 ...

  3. 二叉树、平衡二叉树、红黑树、BTree、B+Tree的区别和联系

    1.二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值. 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为 ...

  4. B-Tree与B+Tree的区别

    二叉树: 左右两个子节点 可以为空 二叉查找树: 左子树小于根节点,又子树大于根节点 平衡二叉树: 任何节点的左右两个子树的高度相差最大为1,(高度相差大于1会旋转操作) B-Tree:(平衡多路查找 ...

  5. MySQL的索引存储数据结构BTree和B+Tree的区别

    文章目录 BTree 原理示意图 B+Tree 原理示意图 B+Tree的树层级很少 B+Tree 可以高效支持范围查找 BTree 原理示意图 注:BTree 就是 B-Tree,实际上官方并没有 ...

  6. MySQL引擎之MyISAM,InnoDB,Btree与B+tree

    目录: MyISAM与InnoDB模块 Btree模块 B-tree与哈希索引的区别 一:MyISAM: 创建一个myisam存储引擎的表的时候会出现三个文件 tb_demo.frm,存储表定义: 2 ...

  7. Btree与b+tree

    1. Btree: B-tree是一种多路自平衡搜索树,它类似普通的二叉树,但是Btree允许每个节点有更多的子节点.Btree示意图如下: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相 ...

  8. btree和b+tree

    btree是为了磁盘或其它存储设备而设计的一种多叉平衡查找树(相对于二叉,btree每个内结点有多个分支,即多叉),而b+tree是btree的一个变种,是b+tree在数据库中的一种实现,是最常见也 ...

  9. 数据结构之BTree、B+Tree的含义及区别

    1.引言 前面学习索引时,了解到MySQL索引的数据类型有B+Tree索引和哈希索引,本文将详细介绍一下BTree和B+Tree的含义和他们的区别. 2.BTree 2.1 概念 B树是一种自平衡树数 ...

最新文章

  1. 电子学会青少年编程等级考试Python一级题目解析11
  2. 网页(Webpage)粒度分析算法
  3. win10安装JDK详细教程
  4. Execute permission missing on User-Defined table Type
  5. python安装路径查看_查看python安装路径及pip安装的包列表及路径
  6. java网络图片与二进制字符串相互转换
  7. XMLHttpRequestEventTarget
  8. python2.7对DICOM图像的读取
  9. 机器学习和深度学习资料汇总【01】
  10. 糖葫芦低通滤波器的设计
  11. 彻底删除的视频怎么恢复?找回丢失的视频有3种方式
  12. 2018.8.10Yukimai模拟Day1
  13. linux系统中查看防火墙开放端口号命令
  14. USB声卡噪音问题,USB声卡中文名设置,基于STM32F411
  15. ASP.NET MVC 支付宝sdk 查询订单状态 填坑攻略
  16. 用 Windows 的 diskpart 命令修复U盘
  17. LeetCode179:最大数
  18. 自学java心路历程(学了半年。。。直到更久。。。。。)
  19. 第一次英语测试,记忆犹新!
  20. 电视剧《猎狐》给我们的启示

热门文章

  1. 凑硬币(58同城2017校招笔试题)
  2. java 财务报表_财务报表开发实例分析:几个通用维度介绍与关键点
  3. 华为云,人工智能入门开发认证试题和答案,HCCDA,AI
  4. 芯片在显微镜下,有哪些不为人知的秘密?
  5. 吐血整理!从外包月薪5K到阿里月薪15K,原理+实战+视频+源码
  6. 中国石油大学《化工原理二》第二阶段在线作业
  7. 上海Java培训机构排名榜单已出炉,实力学员推荐不看后悔
  8. Android 8.0.0-r4源码目录结构详解
  9. 2018世界人工智能大会开幕 森亿智能张少典谈AI与医疗融合
  10. 微信小程序内七牛云图片显示异常