MySQL-B+树索引

B+树是什么?

概述:

B+树是B树的一种变体,属于平衡多路查找树。

B+树的演变:

二叉树 --> 二叉查找树 --> 平衡二叉树 --> B树 --> B+树

二叉树:

概念:

二叉树是n(n>=0)个结点的有限集合

  1. 由一个根节点加上两棵称为左子树和右子树组成二叉树
  2. 可能为空

二叉树案例

特点:

  1. 每个结点的度不超过2(可以理解为二孩政策下的结点最多只能有两个孩子
  2. 每个结点的左子树和右子树顺序不能颠倒,所以二叉树是有序树

任意二叉树都是由下面几种情况所组成的

二叉树结点情况

二叉查找树:

概念:

二叉查找树(BST)也称二叉排序树二叉搜索树,顾名思义,它的功能是为了查找数据的,它在二叉树的基础之上增加个几个限制条件。

特点:

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
  3. 它的左右子树也分别为二叉搜索树。

即:对于二叉搜索树而言,其中的每个结点必然满足,左子结点的值 < 当前结点的值 < 右子节点的值 【如果有左右子节点的话】

二叉搜索树案例

平衡二叉树:

概念:

平衡二叉树(AVL)也叫自平衡二叉搜索树(Self-Balancing Binary Search Tree),所以其本质也是一颗二叉搜索树

平衡指的是每个结点的左右子树的高度差值需要维持在1以内,不出现左右子树高度差异过大造成数据分散不平衡的情况。

特点:

  1. 左子树和右子树的高度之差的绝对值小于等于1
  2. 左子树和右子树也是平衡二叉树

左右子树的高度差被称为平衡因子**(平衡因子=右子树高度-左子树高度)**

因此平衡二叉树所有结点的平衡因子只能是 -1,0,1

平衡二叉树案例

B树:

注意: B-树就是B树,中间的 - 只是连接符,不是减号,B-树 不叫 B减树 。这个名称是由 B-Tree 翻译过来的,只是翻译让人误解了。

概念:

B树又叫平衡多路查找树,平衡是左右子树平衡,多路是相对于二叉而言的。

B树的阶:

所谓的阶指的就是当前B树中,所有结点的的最大子节点个数,如果最大个数为 m ,那么这个B树就称为 m阶树。【m>=2】

提要:

  1. 关键字:k

    关键字其实就是B树进行搜索的key

  2. 存储值(映射数据):v

    对应关键字存储的数据信息value

特点:【假如B树的阶为 m】

  1. 根节点至少有两个子节点,即子树数量范围**[2,m]**
  2. 每个叶子结点结点至少有**ceil(m/2)**个子结点,这里ceil代表向上取整。除了根节点
  3. 平衡、每个结点的所有子树高度一致,也就是说所有的叶子节点都在同一层
  4. 对于非根结点,结点内的关键字个数范围为**[ceil(m/2)-1,m-1]**
  5. 结点内各关键字互不相等且按从小到大排列。
  6. 拥有二叉搜索树的性质。父结点的若干关键字作为分离值分成多个子树,左子树小于对应分离值,对应分离值小于右子树
    B树案例

B+树:

概念:

B+树是B树的变体,也是一种 平衡多路查找树,B+树与B树的基本特征一致,但是又有一些区别。

提要:

  1. 关键字:k

    关键字其实就是B树进行搜索的key

  2. 存储值(映射数据):v

    对应关键字存储的数据信息value

特点:【假如B树的阶为 m】

  1. 每个分支结点最多有m棵子树(孩子结点)。
  2. 非叶根结点至少有两棵子树,其他每个分支结点至少有「m/2]棵子树。
  3. 结点的子树个数与数据信息个数相等。
  4. 结点的子树指针**p[i]指向关键字值大小在[k[i],k[i+1])**区间之间
  5. 所有叶子节点增加一个链接指针链接在一起。
  6. 所有关键字及其映射数据都在叶子节点出现

B+树案例

B+树与B树最大的区别就是数据存放方式。B树的数据存放在每个结点,B+树的数据只存放在叶子结点。

MySQL中的B+树索引:

MySQL中的B+树索引与普通B+树的区别:

  1. MySQL中的结点使用的数据结构为数据页
  2. MySQL中每一层的结点使用双向指针关联组成一个双向链表

MySQL数据页的结构:

MySQL中数据页是由许多条记录组成的

其中记录的简化结构如下:
记录简单模型

其中各部分具体含义为:

  1. record_type:记录头信息的一项属性,表示记录的类型。
    • 0:表示普通记录
    • 1:表示目录项记录
    • 2:表示最小记录
    • 3:表示最大记录
  2. next_record:记录头信息的一项属性,表示下一条地址相对于本条记录的地址偏移量。
  3. 各个列的值
  4. 其他信息:其他隐藏列的值以及记录的额外信息。

数据页的格式:

数据页类型案例

数据页左右两侧边界为record_type = 2 和 record_type = 3 的最大最小记录,中间的是record_type = 0的普通记录或者record_type = 1的目录项记录。数据页内的行记录形成单向链表。

当record_type = 0时,记录类型就是普通的数据记录(叶子结点),存储的是具体的数据。当record_type = 1时,记录的类型就是目录项(即非叶子结点),记录会携带子页指针信息,指向子页。

B+树索引结构:

在Mysql中,B+树以数据页作为结点,同一层的数据页使用双向指针形成双向链表。

非叶子结点中的数据页组成为:最大最小记录、目录项记录

叶子结点的数据页组成为:最大最小记录、普通数据记录

其中数据页中将 最小记录 -> 普通记录或者目录项记录 ->最大记录 由单向指针串联,组成一个单向链表,这样的好处是,范围查询时或者limit时,方便查询数据。

B+树结构

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值