B Tree 的效率已经很高了,为什么MySQL 还要对B Tree 进行改良,最终使用了B+Tree 呢?

总体上来说,这个B 树的改良版本解决的问题比B Tree 更全面。

我们来看一下InnoDB 里面的B+树的存储结构:

MySQL 中的B+Tree 有几个特点:

1、它的关键字的数量是跟路数相等的;

2、B+Tree 的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。搜索到关键字不会直接返回,会到最后一层的叶子节点。比如我们搜索id=28,虽然在第一层直接命中了,但是全部的数据在叶子节点上面,所以我还要继续往下搜索,一直到叶子节点。

举个例子:假设一条记录是1K,一个叶子节点(一页)可以存储16 条记录。非叶子节点可以存储多少个指针?

假设索引字段是bigint 类型,长度为8 字节。指针大小在InnoDB 源码中设置为6 字节,这样一共14 字节。非叶子节点(一页)可以存储16384/14=1170 个这样的单元(键值+指针),代表有1170 个指针。

树深度为2 的时候, 有1170^2 个叶子节点, 可以存储的数据为1170*1170*16=21902400。

在查找数据时一次页的查找代表一次IO,也就是说,一张2000 万左右的表,查询数据最多需要访问3 次磁盘。

所以在InnoDB 中B+ 树深度一般为1-3 层,它就能满足千万级的数据存储。

3、B+Tree 的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。

4、它是根据左闭右开的区间[ )来检索数据。

我们来看一下B+Tree 的数据搜寻过程:

1)比如我们要查找28,在根节点就找到了键值,但是因为它不是页子节点,所以会继续往下搜寻,28 是[28,66)的左闭右开的区间的临界值,所以会走中间的子节点,然后继续搜索,它又是[28,34)的左闭右开的区间的临界值,所以会走左边的子节点,最后在叶子节点上找到了需要的数据。

2)第二个,如果是范围查询,比如要查询从22 到60 的数据,当找到22 之后,只需要顺着节点和指针顺序遍历就可以一次性访问到所有的数据节点,这样就极大地提高了区间查询效率(不需要返回上层父节点重复遍历查找)。

总结一下,InnoDB 中的B+Tree 的特点:

1)它是B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题是什么?(每个节点存储更多关键字;路数更多)

2)扫库、扫表能力更强(如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵B+Tree 拿到所有的数据)

3) B+Tree 的磁盘读写能力相对于B Tree 来说更强(根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多

4)排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)

5)效率更加稳定(B+Tree 永远是在叶子节点拿到数据,所以IO 次数是稳定

B+树(加强版多路平衡查找树)相关推荐

  1. 多路平衡查找树(B Tree)(分裂、合并)

    Balanced Tree 这个就是我们的多路平衡查找树,叫做B Tree(B 代表平衡) 跟AVL 树一样,B 树在枝节点和叶子节点存储键值.数据地址.节点引用. 它有一个特点:分叉数(路数)永远比 ...

  2. B树-多路平衡查找树

    B树 B树 一个m阶B树的具有的特征(或必须满足的条件) B树的查找 B树插入元素(一定是在叶子节点插入) 1.插入后,没有破坏B树的规则 2.插入后,叶子节点元素超过m-1个 B树删除元素 1.删除 ...

  3. 多路平衡查找树 --- B(B-)树

    1 简介 可以用阶数来描述B树, 一棵M阶B树代表着该B树最多有M个孩子节点. 如果M为2, 那么该B树就是一棵二叉搜索树. 一棵M阶B树具有以下性质: 1. 每个节点最多有M - 1个关键字. 跟普 ...

  4. [转]B树(多向平衡查找树)详解

    B-树是对2-3树数据结构的扩展.它支持对保存在磁盘或者网络上的符号表进行外部查找,这些文件可能比我们以前考虑的输入要大的多(以前的输入能够保存在内存中). (B树和B+树是实现数据库的数据结构,一般 ...

  5. 平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现

    对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件 ...

  6. 查找算法之平衡查找树

    前面介绍的算法在最坏的情况下还是很糟糕.这次会介绍一种二分查找树并能保证无论如何构造它,他的运行时间都是对数级别的.理想情况下我们希望能够保持二分查找树的平衡性.但是,在动态插入中保证树的完美平衡的代 ...

  7. 树和而叉查找树的实现

    1.树节点的典型声明 typedef struct TreeNode *PtrToNode;struct TreeNode{ElementType Element;PtrToNode FirstChi ...

  8. 平衡查找树C语言程序,C语言数据结构之平衡二叉树(AVL树)实现方法示例

    本文实例讲述了C语言数据结构之平衡二叉树(AVL树)实现方法.分享给大家供大家参考,具体如下: AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树. 要维持这个树,必须在插入和删除的时候都检 ...

  9. 关于树,各种平衡树查找树的资料合集~~

    我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定.但是,在某些极端的情况下( ...

最新文章

  1. not syncing : corrupted stack end detected inside scheduler解决办法 以及高版本的激活码!
  2. php 点击删除数据,使用php脚本删除数据
  3. 安装配置 flannel - 每天5分钟玩转 Docker 容器技术(59)
  4. 在茫茫人海中发现相似的你——局部敏感哈希(LSH)
  5. kafka-manager安装
  6. AndroidManifest.xml介绍
  7. 变频器端子阻抗3k_PLC与变频器连接问题分析
  8. Dubbo-HelloWorld
  9. JLupin Next Server乍一看
  10. java数组复制的方式和效率比较
  11. window电脑查看ssh公钥,以及将自己的公钥添加到Github等类似网站
  12. 北京创客空间_世界上最大的创客空间,可增强开放安全性等
  13. 【转】自底向上和自顶向下的区别
  14. 系统报 “client没有所需的特权” 的解决方法
  15. 拓端tecdat|r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现|视频
  16. 生产者-消费者模型之集合SynchronousQueue源码解读
  17. 103规约测试软件,Protocoltester(国电南自103规约调试软件)
  18. IAM:瑞策科技位列《全球区块链专利排行榜》第五位
  19. 能力培养——学会学习
  20. 你的金钱和时间流向哪,你的人生就什么样!

热门文章

  1. 未能加载文件或程序集“Antlr3.Runtime”或它的某一个依赖项。参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))解决方法。...
  2. 乱谈数学--我理解的函数极限运算
  3. 第8章 线性时间排序
  4. 【转载】使用 gnuplot 在网页中显示数据
  5. 谨慎全面地对待“滞销”
  6. Windows7无损分区
  7. C#生成Excel报表 用MyXls组件生成更完美
  8. 【webservice】Java JAX-WS和JAX-RS webservice
  9. 指针A - 签到题(顺序三元组)
  10. .NET Compact Framework下的单元测试