mysql底层原理为什么是B+树做索引,为什么不是平衡二叉树,红黑树(大场面试题)

面试官:MySQL为什么选择B+树作为索引结构 最后,总结一下各种树解决的问题以及面临的新问题:二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表;平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低;红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多;B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;B+树:在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度; 阅读详情

平衡二叉树

1.非叶子节点最多拥有两个子节点。

2.非叶子节值大于左边子节点、小于右边子节点。

3.树的左右两边的层级数相差不会大于1。

4.没有值相等重复的节点。

B树

B-树和平衡二叉树稍有不同的是B-树属于多叉树又名平衡多路查找树(查找路径不只两个)

  • 1.在一个节点中,存放着数据(包括key和data)以及指针,且相互间隔。
  • 2.同一个节点,key增序。
  • 3.一个节点最左边的指针不为空,则它指定的节点左右的key小于最左边的key。右边同理。中间的指针指向的节点的key位于相邻两个key的中间。
  • 4.B-Tree中不同节点存放的key和指针可能数量不一致,但是每个节点的域和上限是一致的,所以在实现中B-Tree往往对每个节点申请同等大小的空间。
  • 5.每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d

B+树

  • 1.内节点不存储data,只存储key和指针;叶子节点不存储指针,存key和data。
  • 2.内节点和叶子节点大小不同。
  • 3.每个节点的指针上限为2d而不是2d+1

平衡二叉树的问题

为了解决二叉树数据有序时出现的线性插入树太深问题,树的深度会明显降低,虽然极大提高性能,但是当数据量很大时,一般mysql中一张表达到3-5百万条数据

是很普遍,因此平衡二叉树的深度会非常大,mysql读取时会消耗大量IO。

不仅如此,计算机从磁盘读取数据时以页(4KB)为单位的,每次读取4096byte。平衡二叉树每个节点只保存了一个关键字(如int即4byte),浪费了4092byte,极大的浪费了读取空间。

B-树相对于平衡二叉树的优点

平衡二叉树基本都是存储在内存中才会使用的数据结构。

在大规模数据存储的时候,平衡二叉树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。

我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。

磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定。

所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B-树可以有多个子女,从几十到上千,可以降低树的高度,解决了平衡二叉树读取消耗大量内存空间的问题。

B-树的其他优点

数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。

为了达到这个目的,在实际实现B-Tree还使用了如下技巧:

每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

另外如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会相对其他数据结构更快。

B+树相对B-树的优点

B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。

所以从Mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别。

所以为了减少内存的占用,索引也会被存储在磁盘上。那么Mysql如何衡量查询效率呢?– 磁盘IO次数。

B-树/B+树 的特点就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数。

但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,增加了磁盘IO次数,磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时。

所以我们可以看到B+树的优点:

1、B+树的层级更少。

相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;

2、B+树查询速度更稳定。

B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;

3、B+树天然具备排序功能。

B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

4、B+树全节点遍历更快。

B+树遍历整棵树只需要遍历所有的叶子节点即可,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描

 

 

Mysql底层原理详细剖析+常见面试题(全) 这篇博客主要通过进行学习2021年最新大厂数据库面试讲解,45讲让你透彻理解MySQL索引!前情回顾,如果想了解更多的数据库底层原理可看我其他的文章底层知识链接DQL、DML、DDL、DCL的定义数据库之DQL、DML、DDL、DCL定义事务四个特性、隔离级别以及面临的问题数据库关于事务的详解分析(全)包含面试常问的细节Mysql的主从复制以及Redis的主从复制关于主从复制的超详细解析(全)索引的优化分析、查询截取分析、锁机制Mysql优化高级篇(全)还有其他细节以及数据库的算法题 可看我的专栏。... 阅读详情

相关推荐

面试题:MySQL为什么选择B+树作为索引结构

在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。一、二叉查找树(BST):不平衡二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值。如下是一颗BST(图片来源)。

xuxu96 599

为什么使用B+树而不是使用二叉树,红黑树,哈希表作为索引

红黑树的树高还是太高了,比如当表里面有500w条记录 (也就是500w个索引),全部放到红黑树里面,树的高度会非常高,可能放完500w个索引,树的高度会达到20,所以可能要进行20次I/O操作,我们希望能够降低树的高度。显然,有了索引之后,只需要和磁盘做两次I/O即可,就可以找到key=89的结点,然后把这个结点的value值(磁盘中的文件地址)拿出来,去磁盘中的这个地址取出这行记录。只需要3次I/O即可。(3)B树没有冗余的重复的索引,B+树的非叶子节点和叶子节点有冗余的,重复的索引。

weixin_47414034的博客 526

CPG控制网络入门

从线性变换开始推导

妖米的博客 5037

为什么平衡二叉树也不适合作为索引

平衡二叉树 树形结构是计算机系统里最重要的数据结构。 我们知道,二叉树的查找的时间复杂度是O(log2N),其查找效率与深度有关,而普通的二叉树可能由于内部节点排列问题退化成链表,这样查找效率就会很低。因此平衡二叉树是更好的选择,因为它保持平衡,即通过旋转调整结构保持最小的深度。其查找的时间复杂度也是O(log2N)。 但实际上,数据库中索引的结构也并非AVL树或更优秀的红黑树,尽管它的查询的...

qq_38234594的博客 2497

YOLO-FastestV2从零部署到移动端推理实战手册

本文详细介绍了YOLO-FastestV2从零开始的完整部署流程,涵盖环境搭建、模型训练、格式转换及移动端部署。通过实战步骤,指导开发者将这一轻量级目标检测模型成功部署到Android设备,实现实时推理。文章重点解析了PyTorch到NCNN的模型转换与优化,助力移动端AI应用开发。

l1k9j8h7g6的博客 663

LAMMPS GCMC模拟保姆级教程:从fix gcmc命令到吸附等温线实战

本文提供LAMMPS GCMC模拟的详细教程,从fix gcmc命令设置到吸附等温线实战,涵盖巨正则蒙特卡洛模拟的全流程。通过MOF-5吸附甲烷的案例,指导用户构建模拟体系、转换化学势与压力、定义GCMC区域,并绘制出版级吸附等温线,助力材料科学研究。

weixin_33724046的博客 601

mysql 索引原理为什么用b+树而不用二叉树

相比之下,普通的二叉树(如二叉搜索树)在数据量较大时可能会出现高度不平衡导致检索效率下降、无法支持范围查询以及不利于缓存利用等问题,因此在数据库系统中选择B+树作为索引的数据结构更为合适。在数据库中,索引是一种数据结构,它能够快速定位到存储在数据库表中特定行的数据。:B+树内部节点存储关键字信息,叶子节点包含实际数据或数据的地址,这种结构可以通过最少的I/O操作来定位到数据,减少了磁盘I/O的次数。:B+树的节点通常比较大,在内存中能够容纳更多的关键字和数据,从而提高了缓存命中率,减少了频繁的磁盘访问。

weixin_43106895的博客 907

AD4030-24BBCZ详细资料 Analog Devices 模数转换器 - ADC 24-Bit, 2 MSPS, SAR ADC

AD4030-24BBCZ详细资料  Analog Devices 模数转换器 - ADC 24-Bit, 2 MSPS, SAR ADC

Chen_YYan的博客 792

数据库索引为什么不用二叉平衡树

逻辑上,二叉平衡树的查找次数和效率是最高的,但现实中,数据库索引是保存在磁盘中的,所以为了减少io的次数,从而放弃二叉平衡树,改用B+树,减少io次数。

qq_41716261的博客 298

用Python玩转农业大数据:从Landsat遥感影像到作物产量预测实战教程

本文详细介绍了如何利用Python处理Landsat遥感影像数据,并结合土壤信息构建作物产量预测模型。从环境搭建、数据预处理到模型训练与可视化,提供了一套完整的农业大数据分析实战方案,帮助读者掌握遥感影像处理和机器学习在精准农业中的应用。

weixin_30832143的博客 393

刷题单向链表

实现一个数据结构,维护一张表(最初只有一个元素 11)。接下来 qq 行,每行表示一次操作,操作具体间题目描述。a[i] 里面放的是下一个元素,为0代表链表结束。如单链表1->4 -> 2->3->0用数组表示是。对于每个操作 2,输出一个数字,用换行隔开。第一行一个整数 qq 表示操作次数。

power的专栏 1705

MySQL为啥不用平衡二叉树_MySQL的索引,为什么是B+而不是平衡二叉树

数据库为什么使用B+树?前言讲到索引,第一反应肯定是能提高查询效率。例如书的目录,想要查找某一章节,会先从目录中定位。如果没有目录,那么就需要将所有内容都看一遍才能找到。索引的设计对程序的性能至关重要,若索引太少,对查询性能受影响;而如果索引太多,则会影响增/改/删等的性能。知识点MySQL中一般支持以下几种常见的索引:B+树索引全文索引哈希索引我们今天重点来讲下B+树索引,以及为什么要用B+树来...

weixin_39743695的博客 479

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2066

浅析二叉树、B树、B+树、B*树和MySQL索引底层原理

介绍二叉树、AVL树、红黑树、B树、B+树和B\*树等六种树的数据结构后,浅析MySQL InnoDB索引选择B+树的原因,并给出一些MySQL 索引高频面试题。

a0b79的博客 1060

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

红黑树,B树、B+树、MySQL索引面试题

红黑树,B树,B+树解析

偶尔想看云飞的博客 1593

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL索引底层:B+树详解

前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+树。今天我们一起来学习一下B+树哈~ 树简介、树种类 B-树、B+树简介 B+树插入 B+树查找 B+树删除 B+树经典面试题 树的简介 树跟数组,链表,堆栈一样,它由有限个节点组成,组成具有层次关系的集合,一颗普通的树如下: 树的种类 按照有序性,可以分为有序树和无序树 无序树:树中任意节点的子结点之间没有顺序关系 有序树:树中任意节点的子结点之间有顺序关系 按照节点包含子树个数,可以分为B树和

zhutianrong520的博客 1309

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Mysql底层原理详细剖析

B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。而且,在我们查询位于底层的某个节点(比如 A 记录)过程中,「非 A 记录节点」里的记录数据会从磁盘加载到内存,但是这些记录数据是没用的,我们只是想读取这些节点的索引数据来做比较查询,而「非 A 记录节点」里的记录数据对我们是没用的,这样不仅。所以只保持需要的索引有利于查询即可。

whs_8792的博客 1665

mysql索引红黑树_为什么Mysql用B+树做索引而不用B-树或红黑树?

说这个面试题,先来回顾一下B+树、B-树、平衡二叉树、红黑树的概念平衡二叉树平衡二叉树又被称为AVL树平衡二叉树是一颗空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右子树也是平衡树非叶子节点值大于左子节点值而小于右子节点值非叶子节点最多拥有两个子节点红黑树每个节点要么是红色要么是黑色根节点是黑色每个叶子节点(NIL)是黑色每个红色节点的两个子节点一定为黑色任意一个节点到每个叶子节点的路径...

weixin_36312811的博客 442

MySQL索引及常见面试题

一、索引是什么? 索引(Index)是帮助 MySQL 高效获取数据的数据结构,是对表中一列或多列值进行排序的结构。 就比如索引是一本书的目录,可以通过目录快速查找自己想要查询的东西。 二、索引为什么使用B+树? 先看一下常见的索引存储结构 哈希表 是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后 value 放在数组的这个位置。 哈希表

weixin_48981805的博客 6939

MySQL面试题--最全面-索引

自适应哈希索引是Innodb引擎的一个特殊功能,当它注意到某些索引值被使用的非常频繁时,会在内存中基于B-Tree所有之上再创建一个哈希索引,这就让B-Tree索引也具有哈希索引的一些优点,比如快速哈希查找。这是一个完全自动的内部行为,用户无法控制或配置。使用命令:查看INSERT BUFFER AND ADAPTIVE HASH INDEX;多叉树(multiway tree)允许每个节点可以有更多的数据项和更多的子节点。2-3树,2-3-4树就是多叉树,多叉树通过。

Timebro的博客 3765

面试题-为什么索引使用B+树、而不是B树?或者其他红黑树,二叉树

介绍下B树和B+树 B树 b树是一种平衡多路查找树、相比平衡二叉树它一个节点可以存多个元素、一棵m(m是指一个节点最多有几个子节点)阶的B 树有以下特性: 树中根节点若不是子树、必须至少有两个子节点。 除根节点和叶子结点其他结点至少有[ceil(m/2)](向上取整、比如m=5,就至少有3个子节点)个节点。 节点存储的元素的个数范围是 [ceil(m / 2)-1]<= n <= m-1个 B树叶子结点不包含任何元素、也就是null(为空的目的是查到叶子结点表示没有找到返回null) B+

weixin_43919497的博客 479

数据库索引高频面试题(最新版)

MySQL的索引是面试中的高频题目,将常见的索引面试题目总结了一下,如果有帮到你可以点赞收藏呦。 文章目录索引什么是索引?索引的优缺点?索引的数据结构?Hash索引和B+树的区别?索引的类型有哪些?索引的种类有哪些?B树和B+树的区别?数据库为什么使用B+树而不是B树?什么是聚簇索引,什么是非聚簇索引?非聚簇索引一定会进行回表查询吗?索引的使用场景有哪些?索引的设计原则?如何对索引进行优化?如何创建/删除索引?使用索引查询时性能一定会提升吗?什么是前缀索引?什么是最左匹配原则?索引在什么情况下会失效? .

zydybaby的博客 7056

浅析二叉树、B树、B&#x2B;树和MySQL索引底层原理

摘要:介绍二叉树、AVL树、红黑树、B树、B+树和B*树等六种树的数据结构后,浅析MySQL InnoDB索引选择B+树的原因,并给出一些MySQL 索引高频面试题。 目录综述二叉查找树AVL树/红黑树B树(B-tree)B+树(B+ Tree)B*树(B star Tree)树的总结实际应用中的索

cmdos的专栏 88

java Mysql 面试题,原理,索引,优化----持续补充

mysql 面试题

殷志鹏的博客 1581
上一篇: JAVA面试题(锁)
下一篇: 商城秒杀活动实现思路
wang_lifeng
博客等级 码龄14年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值