B-树

B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图.

B-树有如下特点:

  1. 所有键值分布在整颗树中;

  2. 任何一个关键字出现且只出现在一个结点中;

  3. 搜索有可能在非叶子结点结束;

  4. 在关键字全集内做一次查找,性能逼近二分查找;

B+ 树

B+树是B-树的变体,也是一种多路搜索树, 它与 B- 树的不同之处在于:

  1. 所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)

  2. 为所有叶子结点增加了一个链指针

简化 B+树 如下图

为什么使用B-/B+ Tree

红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构。MySQL 是基于磁盘的数据库系统,索引往往以索引文件的形式存储的磁盘上,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。为什么使用B-/+Tree,还跟磁盘存取原理有关。

局部性原理与磁盘预读

由于磁盘的存取速度与内存之间鸿沟,为了提高效率,要尽量减少磁盘I/O.磁盘往往不是严格按需读取,而是每次都会预读,磁盘读取完需要的数据,会顺序向后读一定长度的数据放入内存。而这样做的理论依据是计算机科学中著名的局部性原理:

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

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。

MySQL(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16K(这个值可以修改).linux 默认页大小为4K

B-/+Tree索引的性能分析

实际实现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)。

而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

为什么使用 B+树

  1. B+树更适合外部存储,由于内节点无 data 域,一个结点可以存储更多的内结点,每个节点能索引的范围更大更精确,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。

  2. Mysql是一种关系型数据库,区间访问是常见的一种情况,B+树叶节点增加的链指针,加强了区间访问性,可使用在范围区间查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

MySQL索引结构--由 B-/B+树看相关推荐

  1. mysql系列十、mysql索引结构的实现B+树/B-树原理

    一.MySQL索引原理 1.索引背景 生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的 ...

  2. 由B+树看MySQL索引结构

    当我们发现SQL执行很慢的时候,自然而然想到的就是加索引.对于范围查询,索引的底层结构就是B+树.今天我们一起来学习一下B+树,从B+树来看MySQL索引结构. 文章目录 B树 B+树 为什么使用B+ ...

  3. Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)

    Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from t where t.col=5 我们在执行一条查询的Sql语句时候,在数 ...

  4. MySQL 索引结构

    文章目录 从一个简单的表开始 页的引入 排序对性能的影响 基于单页模式存储的查询流程 上述页模式可能带来的问题 页目录的引入 页的扩展 多页模式 多页模式对于查询效率的影响 如何优化多页模式 B+树的 ...

  5. MYSQL索引结构学习笔记

    mysql 的数据.索引.DDL 等数据,都是以文件形式存储的, 所以导致每次查询都是一次I/O操作,当I/O操作过大时,会严重影响效率 MYSQL索引结构: mysql使用的是B+树来存储索引的,为 ...

  6. mysql索引为啥要选择B+树 (下)

    有读者在 mysql索引为啥要选择B+树 (上) 上篇文章中留言总结了选择 B+ 树的原因,大体上说对了,今天我们再一起来看看具体的原因. 索引为什么要保存在硬盘中 首先要明白几个概念,服务器存储一般 ...

  7. 由浅入深探究mysql索引结构原理_性能分析与优化_由浅入深探究mysql索引结构原理、性能分析与优化...

    由浅入深探究mysql索引结构原理.性能分析与优化 第一部分:基础知识第二部分:MYISAM和INNODB索引结构1, 简单介绍B-tree B+ tree树 2, MyisAM索引结构 3, Ann ...

  8. mysql索引结构树高度_MYSQL的B+Tree索引树高度如何计算

    前一段被问到一个平时没有关注到有关于MYSQL索引相关的问题点,被问到一个表有3000万记录,假如有一列占8位字节的字段,根据这一列建索引的话索引树的高度是多少? 这一问当时就被问蒙了,平时这也只关注 ...

  9. 图解 MySQL 索引:B-树、B+树

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://tinyurl.com/y5ymnj9a 一. ...

  10. 图解 MySQL 索引:B-树、B+树,终于搞清楚了!

    看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引-. 或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结 ...

最新文章

  1. 打造实用的Fedora 10
  2. LeetCode 524 通过删除字母匹配到字典里最长单词
  3. Python基础——6面向对象编程
  4. EXCHANGE 2013 一例证书故障
  5. Vue-Router 页面正在加载特效
  6. java项目笔记 - 第18章:坦克大战2.1
  7. 反射修饰符 Modifier
  8. UVALive - 5713 Qin Shi Huang's National Road System
  9. 关于二维数组传参做形参
  10. 生成webservice客户端以及解决SSL异常
  11. 关于电脑硬盘灯常亮,电脑很卡问题
  12. Docker常用软件安装之Redis
  13. 数量乘以单价的公式计算机,“excel公式大全详解“单价乘以数量 然后累加的公式 EXCEL...
  14. expand()函数
  15. 厉害!Facebook起诉欧盟委员会:称其数据请求超出必要
  16. 多功能数字钟c语言单片机PPT,基于STC89C52单片机的多功能数字钟的设计
  17. 第二类换元法之三角代换习题
  18. Blender:Lowpoly人物模型
  19. 微服务应用大行其道,我提供一个dto和entity转换工具类,方便大家做转换,少写机械代码,多陪陪家人...
  20. ElasticSearch设置密码Windows

热门文章

  1. 使用phpExcel实现Excel数据的导入导出(完全步骤)
  2. expect的安装与使用
  3. spark入门Intellj环境配置scalark入门Intellj环境配置scala
  4. Block code execution after alert view is displayed in iOS
  5. 4.5.1 段级保护
  6. C#调用非托管代码(C++方法)的2种方式
  7. Thread 线程基础之-线程池ThreadPool一
  8. 工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧一
  9. 高亮显示搜索的关键词(二)
  10. 添加常见 URL Scheme 列表,方便快速查询⓶QA:URL Scheme适配好为何仍然报错