从B+tree开始认识mysql底层原理(一)


如题所述,本章节主要讲述什么是B+tree,以及B+tree的特点。

先抛出一个结论:B+tree是一个多路平衡树。

二叉树

二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。

如下图所示就是一棵二叉查找树
从B+tree开始认识mysql底层原理(一)_第1张图片

红黑树(平衡二叉树)

​红黑树是平衡二叉树(AVL树)的一种,而平衡二叉树是在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。
在平衡二叉树的基础上,红黑树又多了以下几个特点:

  1. 每个节点要么是黑色,要么就是红色 根节点也就是root节点需要是黑色 红节点的子节点一定是黑节点(红节点肯定有父节点,且是黑节点)

  2. 叶子节点和null节点是黑节点(说明了红黑树中一半以上都是黑节点)

  3. 从红黑树的任意一个节点出发到它的叶子节点,它所经过的黑节点数都是相同的,这就是红黑树所需要实现的平衡(也就是说,当前节点的每一条分支路径,它们所包括的黑节点数是一样的,最差的情况就是红黑相间)

  4. 新插入的节点是红节点,可能在参与平衡操作时会变成黑节点(加入直接插入的节点就是黑节点的话,那么每插入一个节点肯定都要做旋转或者变色来达到平衡。但是如果新插入的是红节点且它的父节点是黑节点的话,那就直接插入,整棵树还是平衡的,就不需要再做平衡处理了)
    如上所述即是红黑树的一些特征了,再需要了解的就是红黑树的自平衡的方式,包括:左旋(LL:逆时针),右旋(RR:顺时针),变色
    具体细节可以使用这个网站来进行演示和实验:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

B-tree(平衡多路查找树)

B-Tree是为磁盘等外存储设备设计的一种平衡查找树。因此在讲B-Tree之前先了解下磁盘的相关知识。

系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:

show variables like 'innodb_page_size'

而系统一个磁盘块的存储空间往往没有这么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB。InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。(重点)

B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。

一棵m阶的B-Tree有如下特性:

  1. 每个节点最多有m个孩子。
  2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  3. 若根节点不是叶子节点,则至少有2个孩子
  4. 所有叶子节点都在同一层,且不包含其它关键字信息
  5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
  6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
  7. ki(i=1,…n)为关键字,且关键字升序排序。
  8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree:
从B+tree开始认识mysql底层原理(一)_第2张图片

B+树(重点)

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储3个键值及指针信息,则变成B+Tree后其结构如下图所示:
从B+tree开始认识mysql底层原理(一)_第3张图片
文章参考:
1.数据结构(三)、B树,B+树,B*树
2.二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树

下一节将具体讲一下B+tree在mysql中的使用原理。12


  1. 请自行补一下红黑树以及多路查找树原理 ↩︎

  2. 请自行补一下二分查找原理及实现 ↩︎

你可能感兴趣的:(mysql,mysql,b树,b+树)