MySQL索引底层数据结构B+树详解

B-树、B+树简介

B-树 简介

B-树,也称为B树,是一种平衡的多叉树(可以对比一下平衡二叉查找树),它比较适用于对外查找。看下这几个概念哈:

  • 阶数:一个节点最多有多少个孩子节点。(一般用字母m表示)

  • 关键字:节点上的数值就是关键字

  • 度:一个节点拥有的子节点的数量。

一颗m阶的B-树,有以下特征:

  • 根结点至少有两个子女;

  • 每个非根节点所包含的关键字个数 j 满足:⌈m/2⌉ - 1 <= j <= m - 1.(⌈⌉表示向上取整)

  • 有k个关键字(关键字按递增次序排列)的非叶结点恰好有k+1个孩子。

  • 所有的叶子结点都位于同一层。

一棵简单的B-树如下:

95ff599c4f547a191ec1bc49a4dfba58.png

472503435ac4663ad2adf15542a573e0.png

一颗3阶的B+树如下:

64331ca5f8250a0b314a4427cc34686f.png

B+树和B-树的主要区别如下:

  • B-树内部节点是保存数据的;而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。

  • B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。

  • 查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束

  • B-树中任何一个关键字出现且只出现在一个结点中,而B+树可以出现多次。

B+树的插入

e0993f2bad19d94da729e7b4688ab9d4.png

1. 在空树中插入43

95c7d04b1b8327eb6f1fec5e96a4ea83.png

这时候根结点就一个关键值,此时它是根结点也是叶子结点。

  1. 依次插入48,36

    8cd998eaba716bc9d7e2dc631a42fb15.png

  2. 继续插入 32,发现当前节点关键字已经不小于阶数4了,于是分裂 第⌈4/2⌉=2(下标0,1,2)个,也即43上移到父节点。

    e78350ab6eaccde7f2ff3682ea3b522e.png

  3. 继续插入37,49,前节点关键字都是还没满的,直接插入,如下:

    a6244d88b940639e54232cb8f191f517.png

  4. 最后插入28,发现当前节点关键字也是不小于阶数4了,于是分裂,于是分裂, 第 ⌈4/2⌉=2个,也就是36上移到父节点,因父子节点只有2个关键值,还是小于4的,所以不用继续分裂,插入完成

    6283703b328f56e673f745802b70dbf2.png

    B+树的查找

5a29915fea44775ab43d4e89896f8527.png

b8bafcf978c7c8b9d0c2ea49835cf0f1.png

25eaa684f56ca1ce5f5e941cb7f905a3.png

77d66ee416859554839430c7bb61acde.png

2b0881ecfd87c62316684e3265f0755d.png

7600518cacbc2cf166a621bd1c73471d.gif

8d7cb55348d1a1824451967e3e955070.png

fd92b8884ec83f078957a231fdeece5d.gif

09c2696355f0b768054f72b9a58cf56f.png

a653efd6195afb735779682afff89e4d.gif

93b8ec274f69c98867ddfb070da92140.png

d0f8bec6a573afc2761e2dc8499acebc.gif

e8ddba1e09bf2ff22b09088cb8cebf66.png

B+树经典面试题

  • InnoDB一棵B+树可以存放多少行数据?

  • 为什么索引结构默认使用B+树,而不是hash,二叉树,红黑树,B-树?

  • B-树和B+树的区别

39e41533f2339e7274f91193ad1c3b33.png

c131676660c34ffad1a2130f6a181148.png

003a00f971057603e9a927245cb50586.png

e131dc511b8381c9fe7576dc6517c9aa.png

点个 在看你最好看

60a98db2cb14e1e51cd8c9bb7f220f66.png

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值