MySQL索引的实现——B+树的构造(InnoDB引擎)

       建议三篇一起看:

  1. MySQL索引的实现——行结构(InnoDB引擎)   链接:https://blog.csdn.net/qq_52074153/article/details/128500644
  2. MySQL索引的实现——数据页结构(InnoDB引擎)   链接:                        https://blog.csdn.net/qq_52074153/article/details/128505497
  3. MySQL索引的实现——B+树构造(InnoDB引擎)   链接:                                                      MySQL索引的实现——B+树的构造(InnoDB引擎)_我吃那桌小孩的博客-CSDN博客

      我们都知道MySQL索引底层数据结构是B+树,接下来我会介绍B+树和MySQL是如何制造B+树的。

B+树

B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点、内部节点和叶子节点。多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率。另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找。

B+树特点

  • B+树可以定义一个m值作为预定范围,即m路(阶)B+树。
  • 根节点可能是叶子节点,也可能是包含两个或两个以上子节点的节点。
  • 内部节点如果拥有k个关键字则有k+1个子节点。
  • 非叶子节点不保存数据,只保存关键字用作索引,所有数据都保存在叶子节点中。
  • 非叶子节点有若干子树指针,如果非叶子节点关键字为k1,k2,…kn,其中n=m-1,那么第一个子树关键字判断条件为小于k1,第二个为大于等于k1而小于k2,以此类推,最后一个为大于等于kn,总共可以划分出m个区间,即可以有m个分支。(判断条件其实没有严格的要求,只要能实现对B+树的数据进行定位划分即可,有些实现使用了m个关键字来划分区间,也是可以的)
  • 所有叶子节点通过指针链相连,且叶子节点本身按关键字的大小从小到大顺序排列。
  • 自然插入而不进行删除操作时,叶子节点项的个数范围为[floor(m/2),m-1],内部节点项的个数范围为[ceil(m/2)-1,m-1]。
  • 另外通常B+树有两个头指针,一个指向根节点一个指向关键字最小的叶子节点。
  • 在进行删除操作时,涉及到索引节点填充因子和叶子节点填充因子,一般可设叶子节点和索引节点的填充因子都不少于50%。

MySQL如何构造B+树

      首先,MySQL以页作为B+树的结点。当然这样也会有问题:InnoDB使用页作为管理存储空间的基本单位,也就是最多只能保证16KB的连续存储空间。虽然一个目录项占用不了多大的存储空间,但是架不住表中记录越来越多。此一时需要非常大的连续的存储空间才能把所有的目录项都放下,这对记录数量非常多的表来说是不现实的。

     为了解决这个问题,所以复用了之前存储用户记录的数据页来存储目录项。为了与用户记录进行区分,我们把这些用来表示目录项的记录称为目承项记录。那么,ImoDB是怎么区分条记承是 普通的用户记录还是自录项记录呢?别忘了记录头信息中的record_type属性,它的各个取值代表的意思如下:

  • 0:普通用户记录
  • 1:目录项记录
  • 2:Infimum记录
  • 3:Supremum记录

构造方式

1. 有一系列的页练成双向链表

MySQL索引的实现——B+树的构造(InnoDB引擎)_第1张图片

 2. 目录页对其进行连接

MySQL索引的实现——B+树的构造(InnoDB引擎)_第2张图片

 3.添加一页

MySQL索引的实现——B+树的构造(InnoDB引擎)_第3张图片

 4.一直向上生成

MySQL索引的实现——B+树的构造(InnoDB引擎)_第4张图片

 再次提醒:

记录头信息中的record_type属性,它的各个取值代表的意思如下:

  • 0:普通用户记录
  • 1:目录项记录
  • 2:Infimum记录
  • 3:Supremum记录

你可能感兴趣的:(MySQL,索引,mysql,b树,数据库)