专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
数据分析与开发  ·  为 DeepSeek 辟谣:五大误解与真相解读 ·  3 天前  
数据中心运维管理  ·  2025年AI将改变数据中心建设的本质 ·  4 天前  
51好读  ›  专栏  ›  数据分析与开发

由 B-/B+ 树看 MySQL 索引结构

数据分析与开发  · 公众号  · 数据库  · 2017-01-25 20:24

正文

(点击 上方公众号 ,可快速关注)


作者:ygmyth

segmentfault.com/a/1190000004690721

如有好文章投稿,请点击 → 这里了解详情


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)。







请到「今天看啥」查看全文


推荐文章
数据分析与开发  ·  为 DeepSeek 辟谣:五大误解与真相解读
3 天前
数据中心运维管理  ·  2025年AI将改变数据中心建设的本质
4 天前
教你看穿男人的心  ·  宁愿没有男人,也千万不要找这样的男人!
8 年前
投资明见  ·  徐小明:周三操作策略(0419)
7 年前
房产税(微博搜索)  ·  房产税(微博搜索)-20180216-1
6 年前