MySQL 索引与 B+ 树

MySQL 索引与 B+ 树

B+ 树

MySQL Innodb 存储引擎是使用 B+ 树来组织索引的。在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡二叉树首先满足二叉查找树的定义(左子树的键小于根的键,右子树的键大于根的键),其次必须满足任何节点的两个子树的高度最大差为 1。B 树的维护要求插入和更新节点时,通过 1 次或多次左旋和右旋来满足平衡的条件。二叉查找树是否平衡直接影响了查找需要比较的次数。

B+ 树与普通的二叉树不同,它的节点由多个关键字和指向子树的指针组成,指向子树的指针个数等于关键字个数加 1,这些子树中关键字的范围由它的父节点限定,真正的数据部分是存放在叶子节点中的。MySQL 中页数据结构就是这些叶子节点,每个叶子节点对应了一个 Page,而 Page 的数据结构中有 PAGE_PREV 和 PAGE_NEXT 两个指针,因此这些叶子节点两两之间也是相互连接的。

B+ 树的插入操作

由于 B+ 树需要在插入后依然保证平衡,因此插入操作会涉及到页的拆分操作。Index Page 指的是非叶子结点而 Leaf Page 指的是叶子节点。插入操作分为以下三种情况:

  1. 当 Index Page 和 Leaf Page 都不满时,直接将记录插入到叶子节点中。
  2. 当 Index Page 不满,Leaf Page 满时,先将节点放入对应 Page,以中间节点作为依据,将 Page 拆分,然后将中间节点放入 Index Page 中,拆分后的左右记录分别放在中间节点的左右两边。
  3. 当 Index Page 和 Leaf Page 都满了,先拆分 Leaf Page,然后再拆分 Index Page,拆分 Index Page 的方法与拆分 Leaf Page 的方法一样。

此处需要注意:为了在可能地情况下减少页的拆分操作,B+ 树提供了类似二叉平衡树的旋转操作。旋转操作发生在 Leaf Page 已经满,但是其左右兄弟节点没有满的情况下。

B+ 树的删除操作

B+ 树使用填充因子来控制树的变化,即中间节点关键字的数量和叶子节点关键字的数量和最大值的比例关系。此处以填充因子为 50% 为例。小于填充因子即为小于总容量的一半。删除操作可以分为以下三种情况:

  1. 当 Leaf Page 关键字个数和 Index Page 节点关键字的个数都不小于填充因子时,直接将记录从 Leaf Node 中删除,如果该节点为 Index Page 节点,那么将 Index Page 节点替换为其右节点。
  2. 当 Leaf Page 关键字个数小于而 Index Page 不小于填充因子时,将 Leaf Page 节点和其兄弟节点合并,同时更新 Index Page 节点。
  3. 当 Leaf Page 关键字个数和 Index Page 节点关键字的个数都小于填充因子时,在情况 2 的基础上还需要合并 Index Page 节点。

索引

索引在 MySQL 中就是使用 B+ 树实现的,不同索引之间形成的 B+ 树也是不同的。

聚集索引

聚集索引就是根据主键来构造 B+ 树,叶子节点存放对应页的行记录。

辅助索引(非聚集索引)

辅助索引就是使用非主键构造的 B+ 树,叶子节点存放的是对应的键值以及相应的聚集索引键。通过辅助索引来搜索一般是两级的,第一级找到键值对应的聚集索引键,第二级是根据聚集索引键寻找行记录。

联合索引

联合索引就是对表上的多个列进行索引,这样构造的 B+ 树的 Index Node 和 Page Node 包含多个键。

索引覆盖

在联合索引的情况去搜索行记录,假设需要的行记录的列正好包含在联合索引中,那么此时结果将可以直接从联合索引中得到,省去了从聚集索引中搜索,由于不包含整行的记录所以可以大大减少 IO。

不使用索引的情况

当查询满足条件的行的所有列时,MySQL 不使用辅助索引,而是直接使用聚集索引。原因是即使使用了辅助索引,还是必须通过叶子节点中的目录进行聚集索引的查找,才能得到完整的信息,那么直接从聚集索引中获取即可。

原文地址:https://www.cnblogs.com/bdsir/p/8761482.html

时间: 2024-12-12 09:22:26

MySQL 索引与 B+ 树的相关文章

MySQL索引及执行计划

MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置.MySQL索引默认B+树索引.索引虽然能够提高检索效率,但同时也会降低更新的速度,因为insert .update.delete也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息. 索引类型 主键索引:唯一索引,并且并指定为primary key,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的

B+树|MYSQL索引使用原则

MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下. 事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下. 一.存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的. 在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Ha

Mysql索引为什么用B+树而不用B-树

先从数据结构的角度来看 我们知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据. 从Mysql(Inoodb)的角度来看 B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上.那么Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少

MySQL索引(二)B+树在磁盘中的存储

MySQL索引(二)B+树在磁盘中的存储 回顾 ? 上一篇文章<MySQL索引为什么要用B+树>讲了MySQL为什么选择用B+树来作为底层存储结构,提了两个知识点: B+树索引并不能直接找到行,只是找到行所在的页,通过把整页读入内存,再在内存中查找. 索引的B+树高度一般为2-4层,查找记录时最多只需要2-4次IO. 为进一步知其所以然,今天来聊聊B+树索引在物理磁盘上是怎么设计存储的. 一.理解为什么要减少磁盘IO次数 众所周知,MySQL的数据实际是存储在文件中,而磁盘IO的查找速度是要远

MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下. 一.存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的. 在?MySQL?中,主要有四种类型的索引,分别为:B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引. B-Tree?索引是?MySQL?数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引.Archiv

MySQL索引-B+树(看完你就明白了)

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据.索引最形象的比喻就是图书的目录了.注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找. 索引在 MySQL 数据库中分三类: B+ 树索引 Hash 索引 全文索引 我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引.要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据

Mysql索引为啥用B+树

项目中一直使用Mysql,对于慢sql优化也一直在做,但是一直没有梳理清楚,这里简单总结一下 首先看一下mysql为什么要使用索引 1)索引是帮助Mysql高效获取数据的 排好序的 数据结构 2)索引存储在文件里 首先说明一下,Mysql是使用B+树作为索引的 在没有索引的情况下,如果要找到一条记录的化,是通过全表扫描的 一张数据表中记录了分数,有两个字段,id,core: 如果要查找core=5 的记录,where core=5 ,按照全表扫描顺序查找从第一条记录开始,需要查询6次才可以找到

深入浅出分析MySQL索引设计背后的数据结构

在我们公司的DB规范中,明确规定: 1.建表语句必须明确指定主键 2.无特殊情况,主键必须单调递增 对于这项规定,很多研发小伙伴不理解.本文就来深入简出地分析MySQL索引设计背后的数据结构和算法,从而可以帮你释疑如下问题: 1.为什么innodb表需要主键? 2.为什么建议innodb表主键是单调递增? 3.为什么不建议innodb表主键设置过长? B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.B通常

[转载]MySQL索引原理与慢查询优化

好文,以防丢失,故转之,另对排版做简单优化.原文地址:http://ourmysql.com/archives/1401 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查"mysql"这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者w开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成? 索引原理 除了词典,生活中随处可见索引的例子,如火车站的