首页 > 其他分享 >B+树索引的基本原理

B+树索引的基本原理

时间:2024-02-01 12:32:34浏览次数:29  
标签:包含 基本原理 查询 叶子 索引 节点 图书


  • 索引键:B+树索引的每个节点存储了数据表中一行或多行的索引键(即用于排序和查找的列的值)。
  • 叶子节点:B+树的叶子节点包含了指向数据表中具体行的指针(或者直接包含行数据,取决于索引的实现方式),这些行的索引键值与叶子节点中的键相对应。
  • 非叶子节点:B+树的非叶子节点(包括根节点)用于指导搜索查询向正确的叶子节点方向前进,但它们不包含行数据的直接引用。

例子:图书数据库的B+树索引

假设我们有一个图书数据库,其中的一个表格存储了图书信息,包括BookID(图书ID)、Title(标题)、Author(作者)等字段。我们决定对BookID字段创建一个B+树索引以加速基于图书ID的查询。

初始数据

假设表格中有以下图书ID:

  • BookIDs: 1, 2, 3, 4, 5, 6, 7, 8

B+树索引结构

我们创建一个最大键数为3的B+树索引,对上述BookIDs建立索引。索引建立过程可能如下:

  1. 插入键1到3:最初,根节点可以容纳3个键,所以当插入1, 2, 3时,它们都被存储在根节点。
  2. 插入键4,节点分裂:插入键4时,根节点满了,需要分裂。根节点分裂成两个节点,键2提升为新的根节点键。现在,根节点包含键2,它有两个子节点:一个包含键1,另一个包含键3和4。
  3. 继续插入键5到8:随着键5, 6, 7, 8的插入,树继续按需分裂,保持平衡。

使用B+树索引进行查询

现在,如果我们要查询BookID为6的图书信息,查询操作将遵循以下步骤:

  1. 开始于根节点:查询开始于包含键2的根节点。
  2. 沿右子节点前进:因为6大于2,我们沿着指向键大于2的子节点的指针前进。
  3. 在中间层继续比较:在接下来的节点中,我们比较键值,确定应该沿哪个子节点前进,直到到达包含键6的叶子节点。
  4. 访问数据行:在叶子节点中,键6对应的指针将指向实际存储图书ID为6的图书信息的数据行。

通过这种方式,B+树索引大大减少了需要检查的数据行数,从而提高了查询效率,特别是在处理大量数据时。

标签:包含,基本原理,查询,叶子,索引,节点,图书
From: https://blog.51cto.com/u_14480405/9524922

相关文章

  • Mysql中索引的描述设计
    Mysql中索引的描述设计1,索引是占用存储空间的2,my_myisam.myi和account.ibd存放索引3,查询效率提高,增删改效率降低;索引表以查询为主索引结构 二叉树结构一个根节点下只能有两个节点,当子节点比根节点小在左侧,当比根节点大在二叉树右侧缺点:大数据量时,检索慢,如果都比根节点小会......
  • c# 8.0特性索引和范围
    在阅读代码时碰到以下语法vartype=topic["DevModel/Query/".Length..];其中topic为string,主要疑惑Lenght后面的..查找资料发现为8.0新语法,主要新增了两种语法,官方解释如下使用索引和范围探索数据范围-C#|MicrosoftLearn也有一些其他博主的文章C#8.0特性篇之索引和......
  • informer cache自定义索引
    informercache默认通过namespace/name作为key把对象保存到map中。条件查询时一般通过labels.Selector来过滤,但这需要遍历所有元素,informercache可以类似于MySQL那样建立索引,来提高查询速度。//map根据指定的key来给对象分类//IndexFuncknowshowtocomputethesetofind......
  • 目录索引 & 密码提示
    好像是该干些整理活了。算法笔记可能等以后修。线下比赛记录thuwc2023:梦想:拿到了一等约,接下来还要进省队。GDKOI2023:现实:进一步怀疑自己的能力。CSP2023&NOIP2023:没有写记录,信心逐渐动摇。中考:面对:已弃坑,想来挺可惜的。密码是一模排名,一个三位数。GDOI2023游记:惊醒:密码......
  • MySQL建索引报错:BLOB/TEXT column used in key specification without a key length
    MySQL建索引报错:BLOB/TEXTcolumnusedinkeyspecificationwithoutakeylength因为text类型的字段值太长,没办法为全部内容建立索引,只能指定前多少位字符建立索引;就像这样createindex`索引名`on表名(字段名(600));所以能用varchar能放下的尽量使用varchar吧......
  • 索引和函数视图及存储过程
    索引和函数视图及存储过程1.索引在数据库中索引最核心的作用是:加速查找1.1索引原理为什么加上索引之后速度能有这么大的提升呢?因为索引的底层是基于B+Tree的数据结构存储的很明显,如果有了索引结构的查询效率比表中逐行查询的速度要快很多且数据量越大越明显数据库的索......
  • C#(9):字段,属性,索引器
    函数体中的变量是局部变量字段的修饰符属性是为了简略字段的set()get()方法而发明的,可以起到同样的避免直接使用字段赋值来暴露数据的问题将属性封装成(refactory)属性方法的方法:ctrl+re只读方法只有get(){}而没有set(){}注意:只读方法属性和privateset(){}的区别,只读属性......
  • 【20.0】MySQL进阶知识之索引
    【一】索引的概念索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构,这也是索引最基本的功能。索引对于良好的性能非常关键。数据量越大时,索引对性能的影响也越重要,好的索引可以将查询性能提高几个数量级。在数据量较小且负载较低时,不恰当的索引对性能......
  • js在fori循环中根据索引删除元素时,应该注意哪些问题
    在for循环中根据索引删除数组元素时,应当特别注意以下问题:直接修改循环变量:在JavaScript或其他一些语言中,如果你直接使用for循环遍历数组并删除当前迭代的元素,将会导致索引错乱。因为当你删除一个元素后,数组的长度会减小,但循环的索引并不会因此自动调整。索引越界:......
  • Oracle 不同字符集复合索引长度验证
    Oracle不同字符集复合索引长度验证背景前段时间同事找到一个参数,可以解决Oracle的char和byte模式存储超长的问题.很大程度上解决了研发修改SQL的工作量.但是发现在某些字符集下面会出现一些异常情况.所以想学习和处理一下.需要说明我的数据库版本是Oracle19.21.0.0采......