Mysql为什么选择B+树作为索引结构,而不是红黑树

MySQL面试系列:索引数据结构为什么不用B树、二叉树、哈希表?(四) 前言 面试官:MySQL索引的存储结构是什么? 面试者:是B+树。 面试官:为什么不是B树、二叉树、哈希表? 面试者:%……&(&……(懵逼中) 面试官:MySQL有哪几种索引? 面试者:主键索引、唯一索引、联合索引、普通索引。 面试官:什么是聚簇索引、非聚簇索引、覆盖索引、索引下推、最左原则? 面试者:%……&(&……(懵逼中) 接下来我们就通过了解B+树去全面解... 阅读详情

Mysql为什么选择B+树作为索引结构,而不是红黑树

Mysql小技巧


前言

索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
可以理解为“排好序的快速查找数据结构”

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,

这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。


一、B+树是什么?

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下:

  1. 每个结点至多有m个子女;
  2. 除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
  3. 有k个子女的结点必有k个关键字。

B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

二、不同索引

1.Hash索引

优劣势:
Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描

2.二叉查找树

二叉搜索树的英文名是Binary Search Tree,简称 BST,它是一棵二叉树,具有如下性质::

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 左、右子树也分别为二叉搜索树;
  4. 没有键值相等的节点(因此,插入的时候一定是叶子节点)。

优劣势:
解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表。

3.平衡二叉树

平衡二叉搜索树,又被称为 AVL 树,有别于AVL算法,具有以下性质:

  1. 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1;
  2. 左右两个子树也分别为一棵平衡二叉树。

优劣势:
通过旋转解决了平衡的问题,但是旋转操作效率太低。

4.红黑树

红黑树是一种自平衡的二叉搜索树,除了符合二叉搜索树的基本特性外,它还具有以下性质:

  1. 节点是红色或者黑色的;
  2. 根结点是黑色的;
  3. 每个叶子节点都是黑色的空节点( NIL 节点或者 NULL 节点);
  4. 每个红色节点的两个子节点都是黑色的,从每个叶子节点到根的所有路径上不能有两个连续的红色节点;
  5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。

优劣势:
通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多。

5.B+树

优劣势:
在B树的基础上,将非叶节点改造为不存储数据纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。
此外, B+树, 主要是查询效率高,O(logN),可以充分利用磁盘预读的特性,多叉树,深度小,叶子结点有序且存储数据。


总结

B+树的数据都会浓郁存储在叶子结点,而且叶子结点之间都有指针指向,这会提高范围查询的效率。
所以B+树才是最适合做查询索引的树结构。

希望这个博客能对你有所益处。我是轻王,我为自己代言。

MySQL索引为什么使用B+树,而不用二叉树、红黑树、哈希表、B树? 索引是帮助MySQL高效获取数据的排好序的数据结构。 索引数据结构: 1.二叉树2.红黑树3.Hash表4.B-Tree。 阅读详情

相关推荐

【MySQL】MySQL索引为何使用B+树结构,而不是二叉树、红黑树、B树?

本章节我们主要来聊聊 MySQL索引为何使用B+树结构,而不是二叉树、红黑树、B树?MysQL的索引机制中,有一点可谓是路人皆知,既默认使用B+树作为底层的数据结构。有人会说树结构是以二分法查找数据,所以会在很大程度上提升检索性能,这点确实没错,但树结构有那么多,但为什么要选择B+树呢?而不选择二叉树、红黑树或B树呢?下面一起聊一聊这个话题。

九师兄 791

MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

xaiobit_hl的博客 1440

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

MYSQL数据库为何使用B+树,而不使用红黑树,二叉树作为索引

B+树是一种多路平衡查找树,每个节点可以存储多个关键字和数据,在B+树中,非叶子节点只存储关键字,而不存储数据,因此节点数比二叉树和红黑树更少,查询效率更高。因此,虽然红黑树也可以作为数据库的索引结构,但在处理大量数据时,B+树更适合作为索引结构,因为它可以更好地应对大规模数据的存储和查询需求,同时减少磁盘I/O操作,提高索引查询的效率。B+树可以减少索引更新的代价。由于B+树的非叶子节点只存储关键字,而不存储数据,因此在更新索引时,只需要更新叶子节点,而不需要更新非叶子节点,这可以减少索引更新的代价。

Jerry 1736

Verilog实现FIR滤波器

1、FIR滤波器简介 不追究FIR滤波器的深层含义,我们只关注如何实现;可以看出,FIR滤波器的本质就是延迟、系数相乘与求和,如下图: 2、设计 基于以上分析,按照三级流水实现FIR滤波器设计:信号延迟-系数相乘-求和 `timescale 1ns / 1ps module fir( input clk, input rst_n, input [3:0]din, output reg [9:0]dout ); // data reg reg [3:0]din1; reg [3:.

CLL_caicai的博客 1万+

Cadence Sigrity

目录 一、PowerSI 1、PowerSI仿真前设置 2、PowerSI提取S参数 (1)检查叠层 (2)选择需要提取的走线和GND (3)设置端口 (4)设置提取频率和提取方式 (5)运行仿真 一、PowerSI PowerSI是一个交流分析工具,适用于频域仿真。 S参数提取 电源阻抗提取 全波参数提取 阻抗、耦合检查 谐振分析 1、PowerSI仿真前设置 打开PCB文件: 打开后如图: 设置为单色后: 仿真前的设置:

fang_yang_wa的博客 3万+

mysql索引原理------为什么mysql索引要选择B+树这种数据结构,而不是二叉树,红黑树,B树?

为什么mysql索引要选择B+树这种数据结构,而不是二叉树,红黑树,B树? 首先我们看看二叉树的结构 图片上可以明显看到树的高度是6,如果我们要查询6这个元素的话我们要进行6次查询,这显然不满足实际开发得需求。 然后是红黑树,红黑树是一棵平衡二叉树 可以明显的看到同样的元素,在红黑树的存储的高度比二叉树要低,红黑树会同股哟左旋右旋的操作来减少树的高度,从而到达减少我们查询树种元素的次数来提高查...

我怀念的 1919

HBuilderx连接微信开发者工具

系列文章目录 文章目录系列文章目录前言一、环境1.HBuilerx 工具2.微信开发者工具二、关联微信开发者工具1.HBuilderx新建项目2.关联微信开发者工具3.运行微信小程序出现异常解决方法3.最终效果总结 前言 使用HBuilderx工具关联微信开发者工具,进行小程序开发 提示:以下是本篇文章正文内容,下面案例可供参考 一、环境 1.HBuilerx 工具 HBuilderx 2.微信开发者工具 微信开发者工具 二、关联微信开发者工具 1.HBuilderx新建项目 2.关联微信开发者工具

拥有必珍惜 3070

【SQL/MySQL MySQL索引的数据结构为什么选择B+树,而不是二叉树、平衡/搜索树、红黑树、B树、哈希表?】

摘要:本文深入解析MySQL选择B+树作为索引结构的原因,从磁盘IO特性、数据结构对比到B+树优势进行全面分析。核心观点指出B+树是适配磁盘IO的最优解,而非单纯追求内存查找速度。通过对比二叉树、B树、哈希表等结构,揭示B+树在树高控制、范围查询效率和磁盘利用率上的独特优势。特别说明InnoDB如何通过16KB页大小和聚簇索引优化B+树性能,同时指出B+树适用的数据库场景及其局限性。最终结论强调B+树是MySQL针对磁盘IO特性作出的最优选择。

一起学习进步! 518

滑模控制概述

滑模控制概述1.滑模控制概念2.滑模控制原理3.滑模控制设计步骤4.研究现状5.发展趋势5.1自适应滑模变结构控制5.2模糊滑模控制5.3神经网络与滑模控制的结合 1.滑模控制概念   滑模控制(Sliding Mode Control,SMC)是一种特殊类型的变结构控制(Variable Structure Control,VSC),因此又称之为滑模变结构控制,是近年来广泛应用和发展的一种控制方法。滑模控制本质上是一种非线性控制,即控制结构随时间变化而变化。滑模变结构控制是非线性系统中普遍采用的一种分析方

shiyi20190828的博客 2万+

AHB协议中hreadyout和hready_in的区别

上面这张时序图表明master有两笔写传输,第一笔传输为slave1(s1),传输类型为SEQ,在第一笔传输的第二个周期,也就是第一笔传输的dataphase,此时slave1没有准备好被写数据,因此把s1_hreadyout拉低,但此时slave2已经看到自己的NONSEQ传输了,而且slave2已经是准备好了的。重新拿上面的仿真图看一下,由于前一个周期的s1_hreadyout为低电平,所以s2的hready_in也为低电平,那么该周期s2不会对addr以及控制信号进行采样。就不会出现上面的问题。...

weixin_44101336的博客 2859

为什么MySql索引使用B+树

前言 面试中我们经常碰到面试官问到数据库索引,问到索引就会问你索引的数据结构。类似这种数据结构对于普通程序员来说记住概念几天就忘了,而且概念不是每个人都能很好都理解,所以针对这一原因,我简单通俗都像大家讲解为什么mysql使用都是B+树,而不用其他的树形结构。 正文 Q1:B+树的查询时间大概多少? A:跟树的高度有关,是O(log n)。 Q2:hash查找时间大概多少? A:o(1...

晏霖/胖虎的博客 1万+

华为od 面试八股文_操作系统_01_含答案

华为od 面试八股文_操作系统_01_含答案

MISAYAONE的博客 3250

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

为什么mysql用B+树做索引而不用B-树或红黑树 注:首先如果不了解B+树和B-树的童鞋,可以先阅读这位博主的博文 B-树、B+树、红黑树,都是平衡查找树,那么查询效率上讲,平均都是O(logn)。使用什么哪种数据结构,肯定是出于提高数据库的查询效率的考虑。 一、B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数。 一般来说索引非常大,尤其是关系性数据库这种数据量大的索...

凌凌小博客 1万+

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4886

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【大话Mysql面试】-Mysql的索引为什么要使用B+树,而不是B树,红黑树等之类?

Mysql的索引为什么要使用B+树,而不是B树,红黑树等之类? 在Mysql中,无论是Innodb还是MyISAM引擎,都使用了B+树做索引结构(这里先不考虑Hash索引)。那么我们从最普通的二叉树开始,从而说明Mysql为什么选择B+树作为索引结构。 一、二叉查找树 二叉查找树(BST,binary search Tree)也叫二叉排序树,在二叉树的基础上满足:任意结点的左子树上的所有结点值不大于根节点的值,任意结点的右子树上所有结点值不小于根节点的值。 但如果采用二叉查找树作为索引,并且把id作为索引且

Mind_programmonkey的博客 3900

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

本文探讨了MySQL选择B+树作为索引结构的原因。首先分析了二叉查找树(BST)可能退化为链表导致查询效率下降的问题,进而引入平衡二叉树(AVL)和红黑树,指出AVL旋转耗时、红黑树虽然性能更优但树高仍然过高的问题。特别针对磁盘存储场景,提出树高过高会导致IO次数增加,影响性能。通过对比哈希索引和二分查找的优缺点,指出二叉查找树在磁盘存储中的局限性,最终说明B+树因其矮胖特性、减少IO次数、支持范围查询等优势,成为数据库索引的理想选择。

Atticus的博客 2163

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MySQL 为什么选择B+树作为底层数据结构

MySQL的索引机制中,有一点可谓是路人皆知,既默认使用B+树作为底层的数据结构。有人会说树结构是以二分法查找数据,所以会在很大程度上提升检索性能,这点确实没错,但树结构有那么多,但为什么要选择B+树呢?而不选择二叉树、红黑树或B树呢?下面一起聊一聊这个话题。

埃泽漫笔 1346

为什么mysql索引要使用B+树,而不是B树,红黑树

我们在MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。 为什么

wr_java的博客 2017

mysql为什么选择B+树作为索引结构

mysql为什么选择B+树作为索引结构

m0_54258715的博客 1494

MySQL 索引结构用B+树的原因

MySQL 的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 所以说,如果写select * from tab where name = 'xxx'这样没有进行任何优化的 sql 语句,默认会这样做: 定位到记录所在的页:需要遍历双向链表,找到所在的页。 从所在

ChineseSoftware的博客 3387

mysql为什么使用B+树作为索引的结构

在说B树之前,先来说一下数据库吧. 数据库就是存数据的,查询数据要快,就需要给数据建立索引,就想书要建立目录一下,建立了索引,那这个索引是怎么排序呢?或者说索引的结构是什么样的呢? 在算法中,有一个大家都只知道的算法就是二分法,在大数据量的是时候查询效率是比较高的. 说到二分法在数据结构中有一种二叉树,查询原理就是基于二分法,但是二叉树有缺陷,就是容易"偏瘫",数据不能...

晴天 5087

【Java核心能力】MySQL 索引结构为什么不用红黑树、AVL 树、B树?

MySQL 的索引使用了 B+ 树来实现,先来说一下 B+ 树的 优势: B+ 树是 多路 平衡搜索树,多路可以保证数据量较大时,B+ 树的高度不会非常高(B+树高度越高,磁盘的 IO 次数就越多) B+ 树叶子节点之间按索引数据的大小顺序建立了 双向链表指针 ,适合按照范围查找 使用 B+ 树非叶子节点 只存储索引 ,

qq_45260619的博客 1381

为什么InnoDB索引采用B+树,而不是红黑树或者B树

Mysql、Innodb、索引、B+树、B+tree

kaiwen2001的博客 2694

为什么 MySQL 选择使用 B+树作为索引结构?

作为索引结构,而不是其他数据结构(如 B-树、哈希索引、红黑树等),主要是因为。,需要 30+ 次磁盘 IO,查询速度大大降低。的索引结构,在磁盘 IO、范围查询、排序等方面。而如果使用红黑树,树的高度可能高达。数据库索引的查询性能很大程度上取决于。B-树、哈希索引和红黑树。MySQL 之所以选择。:B+树是 MySQL。

Zero_pl的博客 980

为什么选择B+树,而不是B树,不是hash索引

为什么选择B+树,而不是B树,不是hash表数据库索引为什么使用B+树而不是hash索引为什么选择B树(B+树)不选择红黑树为什么是B+树不选择B树参考文章 数据库索引为什么使用B+树而不是hash索引 数据库索引为什么使用B+树而不是hash。 hash表只能匹配是否相等,不能实现范围查找,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索。 ...

Richard的博客 1119
上一篇: Mysql内储存JSON字符串,根据条件进行查询
下一篇: Golang 正则表达式判断手机号或身份证
猫轻王
猫轻王 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄6年 1万+粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值