数据库索引 - B+树

深入理解数据库索引采用B树和B+树的原因          前面几篇关于数据库底层磁盘文件读取,数据库索引实现细节进行了深入的研究,但是没有串联起来的讲解为什么数据库索引会采用B树和B+树而不是其他的数据结构,例如平衡二叉树、链表等,因此,本文打算从数据库文件存储以及读取说起,讲解数据库索引的由来。      我们以抛出问题的形式开始讲解: (1)数据库文件存储的方式      数据库文件存储都是以磁盘文件存储在系统中的,这也是数据... 阅读详情

目录

特点

实例

查找

插入

删除

总结


B+树是B树的变种,查询效率比B更高。为什么更高?往下看。

参考:https://blog.youkuaiyun.com/z_ryan/article/details/79685072


特点

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据
都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小
自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。


实例

3阶B+树:

这里写图片描述

B+树通常有两个指针,一个指向根结点,另一个指向关键字最小的叶子结点。因些,对于B+树进行查找两种运算:一种是从最小关键字起顺序查找,另一种是从根结点开始,进行随机查找。


查找

       B+树的优势在于查找效率上,下面我们做一具体说明:
  首先,B+树的查找和B树一样,类似于二叉查找树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。在节点内部典型的使用是二分查找来确定这个位置。
  (1)B+树中间节点没有卫星数据(索引元素所指向的数据记录),只有索引。而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少
  B树的卫星数据:

这里写图片描述
  
  B+树的卫星数据:
  这里写图片描述
  

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
  
  (2)因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定
  (3)在范围查询方面,B+树的优势更加明显
  B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,知道查找到范围的上限即可。整个过程比较耗时。
  而B+树的范围查找则简单了许多。首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,整个过程简单许多,效率也比较高。


  例如:同样查找范围[3-11],两者的查询过程如下:
  B树的查找过程:
  这里写图片描述
  B+树的查找过程:
  这里写图片描述


插入


   B+树的插入与B树的插入过程类似。不同的是B+树在叶结点上进行,如果叶结点中的关键码个数超过m,就必须分裂成关键码数目大致相同的两个结点,并保证上层结点中有这两个结点的最大关键码。


删除


  B+树中的关键码在叶结点层删除后,其在上层的复本可以保留,作为一个”分解关键码”存在,如果因为删除而造成结点中关键码数小于ceil(m/2),其处理过程与B-树的处理一样。在此,我就不多做介绍了。


总结


B+树相比B树的优势:
  1.单一节点存储更多的元素(更多指针),使得查询的IO次数更少;
  2.所有查询都要查找到叶子节点,查询性能稳定;
  3.所有叶子节点形成有序链表,便于范围查询。

 

面试题

为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?

这个问题的复杂版本可以参考本文;

简单回答是:

因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出)

指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

 

 

探索B树/B+树与MySQL数据库索引的关系 本文主要讲述主轴线: 由搜索/查找联系到数据结构(搜索树,红黑书,B/B+树); 进行B/B+/RBtree的性能分析; 讲述一些关于数据从内存以及磁盘读取数据的数据存储管理的内容; 对数据库引擎MyISAM和InnoDB的分析; 前言:目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,最近学习了数据结构树这一部分的内容,又阅读了前辈们关于这一话题的的总结后,斗胆运用 阅读详情

相关推荐

分布式数据库之:深入浅出B树索引

作者:禅与计算机程序设计艺术 1.简介 概述 随着互联网业务的快速发展、海量数据的产生及流动,传统关系型数据库在高并发情况下仍然存在一些瓶颈。因此,基于分布式计算架构的分布式数据库应运而生。本文将从分布式数据库的基础理论开始,结合实际应用场景,介绍一种新的B树索引结构—

AI天才研究院 4051

B+树

B+树是B树的变种,比B树有着更高的查找效率 B+树的特性: 1.有k个子树的中间节点包含k个元素,每个元素不保存数据,只用来索引,所有数据都保存在叶子结点; 2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 3.所有的非终端结点(非叶子结点)可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。 B+树中含有两个头指针,一个指向整棵树的根结点,另一个指向关键字最小的叶子结点。同时所有的叶子结点依据其关键字的大小自小

Tianqinse的博客 323

深入探讨数据库索引:B树、B+树、B*树与R树

数据库索引是提高数据库查询效率的重要数据结构,它可以帮助系统快速定位到特定数据。理解索引的结构对于数据库性能优化至关重要。在这一章节中,我们会简要介绍索引的基本概念,以及它如何在关系型数据库中发挥作用。索引可以基于不同的数据结构,比如B树、B+树、B*树和R树等。这些结构针对不同的查询类型和数据操作进行了优化,例如,B树和B+树擅长处理范围查询,而R树则在多维空间数据索引方面表现出色。B树(B-Tree)是一种平衡多路查找树。

weixin_35756624的博客 1226

BTree与B+Tree

目录前言B-TreeB+Tree区别扩展聚簇索引好处局限性 前言 本文内容大部分出自尚硅谷的MySQL教程。 B-Tree B-树的非叶子节点中有关键字、指向关键字具体信息的指针和指向下一个节点的指针,叶子节点没有指向下一个节点的指针,仅有关键字和指向关键字具体信息的指针。 在B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在。 B+Tree B+树的非叶子节点中只有关键字和指向下一个节点的指针,记录只放在叶子节点中。 在B+树中每个记录的查找时间基本是一样的,都需要从根节点走到

技术宇宙 310

Doris存储层设计介绍2——数据写入及删除流程

Doris存储层设计介绍2——数据写入及删除流程

爱吃辣条的博客 4588

TSMC 40nm LP工艺下,新手画版图最容易踩的5个坑(附Cadence避坑指南)

本文详细解析了TSMC 40nm LP工艺下版图设计的5个常见陷阱,包括MOS管尺寸转换、DNW隔离、Guard Ring设计、金属布线和DRC检查。通过Cadence实战技巧和设计规则优化,帮助新手工程师规避典型错误,提升版图设计效率和质量。

weixin_26800111的博客 457

B+树完全解析

一、B+树的结点组成B+树包含两种结点:0、根结点:(一般区分为两种,这里我将根结点分开说明,因为根节点非常特殊而且唯一)      若树只有一层:仅有根结点,此根结点也是叶结点,根结点中索引值个数无最少限制。      若树为两层以及以上:最上面那一层为根结点,根结点属于内部结点,根节点中指针最少为2个。1、叶结点:叶节点在B+树的最底层(所有叶节点都在一层),叶结点中存放索引值、指向记录的指针...

Calcular的博客 2万+

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

MySQL优化二:索引B+树能放多少索引指针?能放多少数据

在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置: SHOW VARIABLES LIKE 'innodb_page_size';

派大星的博客 2127

从‘静态拍照’到‘动态录像’:用Malmquist指数讲好你的效率变化故事(附Stata/R代码)

本文深入探讨了如何利用Malmquist指数构建动态效率分析框架,从静态数据到动态叙事的转变。通过分解技术效率变化(EC)和技术进步(TC),结合Stata/R代码实现四种动态可视化方法,帮助研究者更直观地展示效率变化的动态特征。文章还提供了诊断性叙事结构和比较叙事技巧,助力决策者理解效率提升的来源与趋势。

weixin_32678995的博客 603

C语言编写Picard迭代和牛顿迭代法

为了完成学校计算方法的作业,花了两个多星期将所有实验报告编写出来,看到同桌找代码的辛苦,优快云也没有这类代码,我只是一时兴起,想分享我写的代码与大家共飨,有错误还请多多指正,代码都不难,也是为了让优快云帮我保存下,我辛辛苦苦做出来的,倘若能给别人带来一丝一毫的帮助,我都万分荣幸。 1:什么是Picard迭代 先弄一个满足f(x) = 0的函数将其转化为x= 正在上传… 重新上传 取消 ...

mohenxiang的博客 4699

移动云大云海山数据库(He3DB)B树索引

B树索引是数据库使用场景中最常见的索引。移动云大云海山数据库的B树索引实际上是一种B+树。本文主要介绍数据库的B树索引页面、B树索引结构,以及B树索引创建和插入的过程。在src/backend/access/nbtree/nbtree.c的函数bthandler中,可以找到B树索引的所有入口函数。索引创建:btbuild索引插入:btinsert索引删除:btbulkdelete、btvacuumcleanup。

weixin_43544348的博客 690

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

【数据库】B 树、B+ 树、索引

二叉树是二分树,多分树是二叉树的推广。多分树主要适用于静态的索引数据文件,在插入和删除的时候需要把插入位置之后的每个记录都要向后移动,从而导致增加新的索引项和索引页块,需要对外存上的页块进行大量的调整。因此对于经常需要插入和删除的动态索引顺序文件,使用多分树并不合适,需要采用动态索引结构,即 B 树和 B+ 树。...

Data · Model · Agent · Repeat 3613

Matlab 轴承信号仿真+分析

文章目录项目说明1、信号仿真1.1 仿真公式1.2 信号参数设置1.3 代码实现2、仿真信号分析2.1 小波变换2.2 快速谱峭度 项目说明 本文主要解决两个问题: 1、仿真包含周期性冲击信号、随机干扰冲击信号、调制干扰信号以及随机噪声四个成分的故障轴承信号; 2、使用小波变换以及快速谱峭度对该仿真信号进行分析。 1、信号仿真 1.1 仿真公式 这里的仿真信号公式主要参考了包文杰学者的硕士论文《加权谱峭度故障诊断方法研究与应用》,列举公式如下: 周期性冲击信号仿真 随机干扰冲击信号仿真 调制

cocofisher的博客 9267

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号。在这个示例中,我们选择了一个位于加利福尼亚州旧金山市附近的点,其经度为-122.084,纬度为37.421998。首先,我们需要导入必要的库和模块。接下来,我们定义一个函数,该函数将接收经度和纬度作为输入,并返回对应的Landsat路径/行号。最后,我们提取路径和行号的值,并将它们作为结果返回。现在,我们可以使用这个函数来获取特定点的Landsat路径/行号。

VwajAlgorithm的博客 348

数据库索引 B树 B+树

前言 本文是在讲述什么样的数据结构适合作为索引,以及其适合作为索引的原因。而阅读本文需要对B树和B+树结构有稍微的理解。以及需要对磁盘操作知识有稍微的了解。对于磁盘操作的相关知识,在文章尾部的链接文章中,有详细的介绍。 在MySQL中,主要有四种类型的索引,分别为:B-Tree索引,Hash索引,Fulltext索引和R-Tree索引,本文讲的是B-Tree索引。 什么是索引 索引(Index)是帮助数据库高效获取数据的数据结构。索引是在基于数据库表创建的,它包含一个表中某些列的值以及记录对应的地址

程序员必须坚持写博客,没人看也要写 2629

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

面试总结(数据库索引、B树、B+树)

1.          数据库系统维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引的实现通常使用B树及其变种B+树。          创建索引可以大大提高系统的性能。        第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。        第二、可以大大加快数据的检索

yutianxin123的专栏 9919

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据库索引B树、B+树、Hash索引

转发:https://uule.iteye.com/blog/2429508 数据库索引B树、B+树、Hash索引 博客分类: 数据库 数据结构 程序员小灰 - 漫画:什么是B-树?(注意查询、插入删除的图解) 程序员小灰 - 蛮会:什么是B+树? MYSQL中的几种索引 MYSQL索引实现原理(重要) B树与B+树 MYSQL索引原理详解 联合索引(复合索引)在...

jiangbinbin的博客 744

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据库索引、B树、B+树

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时

Marelin的专栏 3555

数据库索引原理 b树

1 .B-树定义B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树;⑵若根结点不是叶子结点,则至少有两棵子树;⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据:      (n,A0,K1,A1,K2,…,Kn,An)其中:Ki(i=1,2,…,n)为关键码...

coolwriter的博客 1万+

B+树和B*树及数据库索引了解

B+树,B*树的理解。数据库索引使用B+树的原理

电气工程专业本科生、辅修计算机。分享嵌入式、后端等方面的系统学习路径。 936

B树:数据库索引的基石

B树是数据库索引的核心数据结构,具有平衡、多路分支等特性,能够在对数时间内完成查找、插入和删除操作。本文详细介绍了B树的基本概念、操作原理及其在数据库中的实际应用,重点分析了B+树的改进优势。通过案例展示了索引设计优化、选择性分析和覆盖索引等实践技巧,并比较了不同B树变种的适用场景。理解B树有助于设计高效数据库模式、优化查询性能,是数据库调优的重要基础。

从不水文,坚持创作,加油 1684

数据库为什么使用B+树而不是B树做索引

B树和B+树是数据库索引结构中常用的两种树型数据结构。它们相似但又有一些不同之处,本文将分别介绍B树和B+树的特点,并解释为什么数据库更倾向于使用B+树而不是B树来做索引。

黑夜开发者的博客 1581

数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)

1.什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 2.索引的优缺点 优点: 1.大大加快数据的检索速度 2.创建唯一性索引,保证数据库表中每一行数据的唯一性 3.加速表和表之间的连接 4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 缺点 1.索引需要占用数据表以外的物理存储空间 2.创建索引和维护索引要花费一定...

Windsearcher的博客 1848
上一篇: 数据库索引 - B树
下一篇: Spring事务整理篇
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值