B-树的结构特点和增删改查过程

B-树的结构特点和增删改查过程


索引的数据结构
索引基于树的结构是因为树的查询效率比较高。从算法逻辑上看,二叉查找树的查找速度和比较次数都是最小的,其查询的算法复杂度是O(logN),索引基于B+树或B-树而不是二叉树的原因是考虑了磁盘IO。
数据库的索引存储在磁盘上,当数据库比较大时,索引也相对比较大,可能有几个G甚至更多,所以当应用索引时,不能将整个索引加载到内存上,只能逐一加载每个磁盘页,而每个磁盘页对应每个索引树节点。
当利用二叉树作为索引的数据结构时,最坏情况下,磁盘IO次数等于树的高度,而二叉树相对比较瘦高,因此相对矮胖的B树更适合作为索引的数据结构。

B-树
B-树(Balance 树)是一种多路平衡查找树,每个节点最多包含m个孩子,m的大小取决于磁盘页的大小,称为B-树的阶数。
B-树的特征:

  1. 根节点至少有两个孩子;
  2. 每个中间节点包含k-1个元素和k个孩子(m/2 <= k <= m);
  3. 每个叶子节点包含k-1个元素(m/2 <= k <= m);
  4. 所有叶子节点位于同一层;
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

下面以一个3阶B-树为例,介绍B-树的具体结构。具体看(2,6)节点,该节点有两个元素2和6,三个孩子1,(3,5),8。其中孩子1小于节点元素2,孩子(3,5)位于节点元素2和6中间,而孩子8大于节点元素6,符合上述列出的B-树特征。
3阶B-树

B-数的查询过程(假设查询的数值是5):

第1次磁盘IO,在内存中定位和9比较
在这里插入图片描述
第2次磁盘IO,在内存中定位和(2,6)比较
在这里插入图片描述
第3次磁盘IO,在内存中定位和(3,5)比较
在这里插入图片描述
通过整个流程可以看出,B-树在查询过程中的比较次数不比二叉树少,尤其当一个节点中的元素较多时。但是内存中的比较耗时与磁盘IO相比几乎可以忽略不计,节点中的元素多点没关系,只是多了几次内存交互,只要树的高度足够低,磁盘IO的次数就足够少,从而提升查找性能。

B-树插入过程
为了维持B-树的多路自平衡,B-树插入过程比较复杂,而且分很多种情况,下面举一个最简单的例子,假如插入的数据是4,首先自顶向下查找4的节点位置,发现4应当插入到节点元素3,5之间。
在这里插入图片描述
节点(3,5)已经是两元素节点,无法再增加。父亲节点 (2,6)也是两元素节点,也无法再增加。根节点9是单元素节点,可以升级为两元素节点。于是拆分节点(3,5)与节点 (2,6),让根节点9升级为两元素节点 (4,9)。节点6独立为根节点的第二个孩子。
在这里插入图片描述

B-树删除过程
假设删除的元素是11
自顶向下查找元素11的节点位置,删除11后,节点12只有一个孩子,不符合B树规范。因此找出12,13,15三个节点的中位数13,取代节点12,而节点12自身下移成为第一个孩子。(这个过程称为左旋)
在这里插入图片描述
B-树主要应用于文件系统以及部分数据库索引,比如著名的非关系型数据库MongoDB。而大部分关系型数据库,则使用B+树作为索引。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus提供了一套便捷的Service和Mapper接口,它们在功能和用法上有一些区别。 1. Mapper接口: - Mapper接口是基于MyBatis的原生Mapper接口,用于定义数据库操作的方法。您可以通过继承`BaseMapper`接口,或者自定义Mapper接口,并使用注解或XML配置SQL语句来完成数据库的增删改查操作。Mapper接口提供了基本的CRUD操作方法,如`insert`、`delete`、`update`和`select`等。 2. Service接口: - Service接口是基于MyBatis-Plus的Service接口,封装了常用的CRUD操作,提供了更加便捷的方法来进行数据库操作。您可以通过继承`IService`接口,或者自定义Service接口,并实现它提供的方法来实现对数据库的增删改查操作。Service接口提供了一系列方法,如`save`、`remove`、`update`和`getById`等,可以简化数据库操作的编写。 区别: - Mapper接口是MyBatis的原生接口,需要手动编写SQL语句,并且需要手动调用Mapper接口的方法进行数据库操作。 - Service接口是MyBatis-Plus提供的封装接口,封装了常用的CRUD操作,可以直接调用Service接口的方法进行数据库操作,无需手动编写SQL语句。 总的来说,Mapper接口更加灵活,可以自由编写SQL语句,适用于复杂的数据库操作;而Service接口提供了便捷的封装方法,适用于快速、简单的数据库操作。在实际开发中,可以根据具体需求选择使用Mapper接口或Service接口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值