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

MySQL库数据 - 索引 看红字部分即可数据库索引是一种数据结构,用于提高数据库中数据的查询效率。索引是在数据表中某一列或多列上创建的数据结构,它可以帮助数据库快速地定位和检索数据。通过使用索引,数据库可以避免全表扫描,从而大大提高查询性能。索引可以类比于书籍的目录,它记录了数据表中每一行数据的位置,使得数据库可以根据索引进行快速的查找。当我们执行查询语句时,数据库引擎会首先检查是否存在适用的索引,如果存在索引,数据库就可以直接定位到索引指定的位置,而不需要遍历整个数据表。这样可以大大减少查询的时间和资源消耗。数据库。 阅读详情

首先索引是帮助MySQL高效获取数据的排好序的数据结构。那么为了搞清楚原因,我们首先简单说一下几种索引结构:

  • 二叉树   二叉树是一种每个节点最多有两个子节点的树结构,二叉树中的每个节点只能存储一个关键字和数据,因此需要更多的节点来存储相同的数据量。

如上图,col2,使用二叉树进行索引,比如如果要查找值为89的行,那么只需要两次I/O操作,但是如果对col1进行索引,那么二叉树则无法达到很好的平衡,将成为一个只有右侧节点的链表,若想查找值为6的行,仍然需要进行6次I/O操作。

  • 红黑树  红黑树具有良好的平衡性,查询效率较高,且适用于内存中的数据结构。但是红黑树与二叉树类似,每个节点只存储一个关键字和数据,所以,如果想要存储更多的数据量,则需要更多节点,更大的高度,此时不但会增加内存开销,随着数据量的增加,I/O次数也会相应增加。同时,红黑树中的平衡调整会涉及到节点的旋转操作,这些操作需要在磁盘中进行,因此红黑树的平衡调整会涉及到更多的磁盘I/O操作,会影响索引查询的效率。
  • Hash 表  Hash 表数组+链表来存储索引的一种数据结构。与HashMap类似。对索引进行hash 来确定索引位置,并针对hash冲突的数据进行链表存储处理。每一个索引位置存储的是索引值及索引行所在的物理地址。该表结构能够一次I/O快速定位某个索引所在数据行。如下图,但是如果想要进行范围查询,那么该索引结构将无能为力。

  • B树 B树每个节点存储了索引及索引数据(比如物理地址),每个叶节点具有相同的深度,如果按照默认大概16K的页大小计算,互联网数据每行数据大概1K计算,每个节点可存16条数据。也就是意味着,我们如果要存储大量数据,则需要更高的树结构完成。同时,因为B树中,虽然节点中索引是从左到右按大小排序,但是节点之间不存在指针连接,意味着,如果需要查询某一个范围中的数据,一旦一个节点中的数据读取完毕,进行下次查询时,仍然需要从头节点开始进行查找下一个节点所在的位置。也就是说对范围查询仍然无法得到更好支持。
  • B+树  B+树是一种多路平衡查找树,每个节点可以存储多个关键字和数据,在B+树中,非叶子节点只存储关键字,而不存储数据,所以这就意味着,每个节点可以存储更多的索引数据及节点指针,同时所有子节点均冗余了索引所在数据行,这就意味着,较低的高度,就可以存储客观的数据。比如,mysql inndb 索引页大小默认16K,非子节点一个索引和节点指针占用大概8+6个字节,那么每个非叶子节点,大概可以存储1170个索引数据,若是树高为3,那么就可以存储1170* 1170*16(子节点每个数据大概占用1k,所以仅可以存储16个数据行),约2千万条数据轻松完成存储。同时,B+树的叶子节点构成一个有序链表,叶子节点间存有相互指针,支持高效的区间查询操作。 

所以,综合以上说明,MYSQL使用B+树结构做数据索引的原因: 

  1. B+树是多路平衡查找树,每个节点可以存储多个关键字和数据,因此可以减少节点数,从而减少磁盘I/O次数,提高检索效率。相比之下,二叉树、红黑树的节点只能存储一个关键字和数据,需要更多的节点来存储相同的数据量。节点的增多势必会增加I/o操作,降低效率。

  2. B+树具有很好的顺序性,可以提高区间查找的效率。由于B+树的叶子节点构成一个有序链表,因此在执行范围查询时,只需要遍历有序链表,而不需要进行全表扫描,从而提高查询效率。很显然Hash 无法支持范围查找,而B树在范围查找时,因为叶子节点之间没有相互之间的指针,无法知道彼此地址,在一个节点完成查询后,必须再次从根节点进行I/O定位查询下一个范围节点。

  3. B+树可以减少索引更新的代价。由于B+树的非叶子节点只存储关键字,而不存储数据,因此在更新索引时,只需要更新叶子节点,而不需要更新非叶子节点,这可以减少索引更新的代价。

  4. B+树对于大型数据集的存储和查询效率更高。由于B+树具有良好的平衡性和顺序性,因此在存储和查询大型数据集时,B+树的效率更高,能够更好地应对大规模数据的存储和查询需求。

总之,数据库使用B+树做索引是为了提高检索效率、支持高效的区间查询、减少索引更新代价以及更好地应对大规模数据的存储和查询需求。

以上学习拙见,如有错误,敬请指正。

红黑树效率如此之高,MySQL为何不采用? ①-二叉树、红黑树、Hash、B+树 索引:索引是帮忙MySQL高效获取的排好序的数据结构 索引数据结构: 二叉树 红黑树 Hash表 B-Tree 1.二叉查找树(Binary Search Trees) 左节点比父节点要小,右节点比父节点要大。他的高度决定的查找效率。 平衡二叉查找树: 非正常的倾斜二叉查找树: 如果某一列数据遇到像‘倾斜二叉查找树’,那么这个二叉树索引,其实就蜕化成了“链表”,查询此列数据还是全表扫描的方式,就失... 阅读详情

相关推荐

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

索引是帮助MySQL高效获取数据的排好序的数据结构。 索引数据结构: 1.二叉树2.红黑树3.Hash表4.B-Tree。

折叠伞的博客 2593

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

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

xaiobit_hl的博客 1440

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

这篇文章主要简单总结下二叉树、红黑树、B树、B+树、B*树的基本结构和原理。

liwangcuihua的博客 3824

MySQL InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红黑树或二叉树?

由于B+树的叶子节点存储了全部数据,而内部节点仅存储键值和指针,这样在数据库查询时,可以更有效地利用磁盘块的预读能力,减少磁盘I/O访问次数。因此,对于数据库中常见的范围查询和排序操作,B+树索引更适合。B+树的内部节点仅存储键值和指针,而叶子节点存储了全部数据和指针,这样可以更好地利用磁盘空间。综上所述,MySQL InnoDB选择使用B+树作为索引结构,是因为B+树在范围查询和排序性能、数据块访问、磁盘空间利用率以及并发和事务处理方面有优势,并且更适合满足数据库的常见查询需求和事务处理要求。

学亮编程手记 1402

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

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

九师兄 791

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 423

揭秘InnoDB:为何MySQL选择B+树作为索引结构

我们知道MySQL数据库InnoDB引擎索引的数据结构是B+树,那他为什么不用红黑树,不用B树呢?用B+树的优点在哪里?解决了些什么问题?本文将以这几个疑问点为中心详细说明一下MySQL选用B+树的原因。

云泽的博客 1276

PCI-Express、MiniPCIe、ExpressCard接口转换说明/引脚互换关系

通过引脚PIN互换可以在PCI-Express、MiniPCIe、ExpressCard之间切换不同的接口;提供接口引脚表和标准尺寸图。

tech34的博客 7114

mysql索引为什么使用B+树

mysql慢查询如何优化

efggfxfvhh的博客 824

STM32F103C8T6 Bootloader开发实战:串口IAP固件升级与Keil工程配置详解

本文详细介绍了STM32F103C8T6 Bootloader开发实战,重点讲解串口IAP固件升级的实现方法与Keil uVision5工程配置。通过Flash分区管理、USART1通信协议设计及应用程序跳转机制等核心技术,帮助开发者掌握嵌入式系统固件升级方案,提升设备维护效率。

weixin_29165725的博客 433

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 856

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

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

qq_38234594的博客 2497

「大模型学习」(14)Long Context之线性插值、NTK-aware、Yarn、LongRoPE

大语言模型长上下文扩展中的位置插值技术 摘要:为解决大语言模型(LLMs)在推理阶段扩展上下文窗口时的位置编码限制,研究人员开发了一系列位置插值技术。这些方法主要针对旋转位置编码(RoPE)机制,通过不同策略调整位置索引以适应超出训练长度的上下文。典型方法包括:基础位置插值(PI)均匀缩放位置索引;NTK-aware插值对不同频率维度差异化处理;NTK-by-parts插值根据波长分段调整;Yarn插值结合温度调节;以及LongRoPE采用非均匀插值策略。这些技术在不修改模型结构的前提下,通过调整位置编码的

qq_43044037的博客 1634

MySQL索引类型

定义: 帮助MySQL高效获取数据的数据结构 索引方式: hash散列法 时间复杂度O(1) 哈希算法(也叫散列)、就是任意长度值(Key)通过散列算法变换成固定长度的Key地址,通过这个地址进行访问的数据结构。他通过把关键值映射到表中一个位置来访问记录,以加快查找速度。 mysql默认索引就是hash的方式 这个映射函数就是我们说的散列函数,存放记录的数组叫做散列表。 通过hash会将(id)计算出一个hash值,然后通过这个值就能得到对应的数据 缺点: 1、不支持..

weixin_56289362的博客 1473

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

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

怎样让你的论文看起来“像人写的”?只用三招直接去除AI味(附提示词)

当然如果你在实际使用中还有其他需求,比如降重润色、改写翻译等,也可以结合七哥的专业写作平台来辅助,这个高级学术平台已经内置了ChatGPT4o、ChatGPT4.1、Claude3.7、满血版DeepSeek-R1等AI大模型,帮你写文献综述、干课题申报、写论文等学术任务绝对每一点问题。比如我自己的一套学术写作平台,其中的“降重与润色”模块整合了多种GPTs应用,除了能帮助调整语言风格、避免雷同表达,还可以顺带降个重,对于提升学术文本的整体质量还是非常有用的。一、为什么用AI写出来的文章会有AI味?

智能AI让学术科研更容易 1662

MySQL-为什么采用B+树作为索引的数据结构

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 索引本身数据量也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储到磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,提升索引效率。 常用的查找结构: 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕。 二叉树

了解➔熟悉➔掌握➔精通 433

036、算子映射:如何将ONNX算子映射到NPU硬件指令?

《算子映射:ONNX到NPU的转换艺术》 本文深入探讨了将ONNX算子映射到NPU硬件指令的技术挑战与实践经验。作者通过真实案例揭示了映射过程中的常见陷阱,如Reshape算子被错误映射导致分类错误。文章详细分析了三种映射策略(直接映射、拆分映射和融合映射),并强调映射表在编译器中的核心作用。特别针对动态形状、精度对齐等难题提供了解决方案,分享了编写映射表时的实用铁律,包括先优化后映射、严格单元测试等。最后指出,成功的算子映射需要在数学语义、硬件约束和性能优化之间找到精确平衡,这种看似枯燥的工作实则决定着N

m0_50546716的博客 177

为什么Mysql底层采用B+树做索引?

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

qq_37933128的博客 4782

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

二叉树 红黑树 B树 B+树的优缺点

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

jinking01的专栏 8416

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

本篇博客的主要内容是MySQL当中的索引概念、索引作用、索引的使用情况。以及介绍了几种常见的数据结构:数组、链表、二叉搜索树、平衡二叉搜索树、红黑树、B-树、B+树...

岁岁岁平安的博客 1812

android 蓝牙通讯demo

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

红黑树、b+树、b树、mysql索引详细剖析

文章目录树基础知识回顾红黑树b树、b+树为什么不能使用二叉树来存储数据库索引B/B+树的索引数量索引什么是聚簇(集)索引?mysql聚簇和非聚簇索引的区别b+树和哈希索引二级索引二级索引存储主键值而不是存储行指针的优点与缺点 树基础知识回顾 排序二叉树:左 < 根< 右 B 树:有序数组 + 多叉平衡树,节点存储关键字、数据、指针; B+ 树:有序数组链表 + 多叉平衡树,非叶子节点存储指针、关键字,不存储数据; 红黑树:红黑树是一种不大严格的平衡树(平衡树要求太高) 红黑树 红黑树: 红黑树(

qq_41358574的博客 4301

【MySQL】MySQL为什么用B+树做索引而不用B-树或红黑树?

思考: 1.什么是数据库索引? 数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找(linear search)时间复杂度为O(n),显然在数据量很大时效率很低。优化的查找算法如二分查找(binary search)、二叉树查找(binary tree search)等,虽然查找效率提高了。但是各自对检索的数据都有要求:二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织)。所以,在数据之外,

时光、疏离了记忆づ童话的博客 1万+

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

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

凌凌小博客 1万+

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

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

Atticus的博客 2163

二叉树、红黑树与 B 树的对比

是计算机科学中常用的树形数据结构,它们在结构、特性和应用场景上有显著差异。

Very_a的博客 1783
上一篇: Git 还原远程更改
下一篇: 【代码质量的重要性:如何编写具有高质量标准的代码】
飞行的鞋子
博客等级 码龄18年 3粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值