二叉搜索树的2层结点统计_MySQL进阶一:索引底层结构B+树

前言:

为什么MySQL索引底层结构采取B+树?除了搜索性能方面的因素还有其他原因吗?

一、B+树的结构

因为B+树是m叉树,m叉树最简单的一种就是二叉树,且B+树是B树的变形形式,我们就从二叉树和B树开始介绍。

1、二叉树

见到比较多的应该是二叉树,以下是引用百度百科的定义:

在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。

二叉树又可以细分为:满二叉树、完全二叉树和平衡二叉树等。

ef883164c3aa8364f9e4386c3bee405d.png

满二叉树

除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

完全二叉树

在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。

平衡二叉树

平衡二叉树又称为AVL树,它是一种二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

1f9da7ec050e7f6b4f44c798e5e275f3.png

2、B树

55e2977af2a7148e019712831fc33d19.png

又称为B-树、B_树,引用百度百科的定义:

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:1、根结点至少有两个子女;2、每个非根节点所包含的关键字个数 j 满足:m/2 - 1 <= j <= m - 1;3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:m/2 <= k <= m ;4、所有的叶子结点都位于同一层。5、在B树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。

3、B+树

现在切入正题,正式介绍B+树。B+ 树是一种树数据结构,通常用于数据库和操作系统的文件系统中。以下同样来自百度百科的定义:

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下: (1)每个结点至多有m个子女;(2)除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;(3)有k个子女的结点必有k个关键字。B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

B+树与B树的区别主要如下:

  • 非叶子节点不再存储数据,只存储索引。
  • 叶子节点之间增加了链表,可以获取所有的节点,不再需要中序遍历。

二、B+树的查询过程

B树的查询过程如下:

  1. 首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法)。
  2. 若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查找的关键字在Ki与Ki+1之间,Pi为指向子树根节点的指针,此时取指针Pi所指的结点继续查找,直至找到,或指针Pi为空时查找失败。

而B+树由于只有在叶子节点存储数据,所以具体查询过程如下:

60b16012330c862a7084be166d3f4606.png
  1. 首先把根结点取来,在根结点所包含的关键字K1,…,Kn查找给定的关键字(可用顺序查找或二分查找法)。
  2. 若找到等于给定值的关键字,继续通过指针往下查询,直到定位到叶子节点的数据,则查询成功,否则查找失败。

三、磁盘预读与局部性原理

局部性原理的逻辑如下:

  1. 内存读写块,磁盘读写慢,而且慢很多;
  2. 磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的数据,如果未来要读取的数据就在这一页中,可以避免未来的磁盘IO,提高效率;
  3. 局部性原理:软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO;

刚好B+树的索引数据是按照顺序依次存储的,这就能很好的利用磁盘预读来提高搜索效率.

四、B+树的优势

MySQL索引底层结构之所以采用B+树,主要有以下几点:

  • 很适合磁盘存储,能够充分利用局部性原理,磁盘预读;
  • 当简单的查询时,用hash搜索(复杂度为1)可能更快,而B+树的复杂度为对数级,但涉及到排序和范围查询时显然B+树的性能更高,复杂度还是为对数级。
  • 相比二叉树,B+树能以更低的高度存储大量的数据。
  • 索引本身占用的内存很少。

参考:

https://mp.weixin.qq.com/s/YMbRJwyjutGMD1KpI_fS0A

https://www.cnblogs.com/guohai-stronger/p/9225057.html

https://www.jianshu.com/p/71700a464e97

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值