MySQL 选择 B+树作为索引数据结构的原因

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

MySQL 选择 B+树作为索引数据结构的原因与其设计特性息息相关。B+树不仅能很好地支持数据库常见的查询操作,还能高效处理大规模数据并优化磁盘IO操作。以下是对 B+树各方面优势的详细说明:

1. B+树的平衡性

B+树是一种 自平衡树,即每次插入和删除操作后,树的高度会自动调整,确保其高度保持相对稳定。这一特性带来了以下好处:

  • 查找效率稳定:无论索引包含多少数据,B+树都能够在较短的路径内完成查找,平均查找时间复杂度为 O(log N),其中 N 为树中元素的数量。相比于线性查找的 O(N),B+树能够显著加快查询速度。
  • 高度较低:B+树的非叶子节点可以包含多个键值(即更多的分支度),所以树的高度较低,减少了查找时需要访问的节点数量。特别是在数据库中,索引通常存储在磁盘上,节点高度低意味着更少的磁盘访问次数,大大提升了查询效率。

2. 磁盘IO效率

数据库中的大部分数据存储在磁盘中,而磁盘访问的速度远慢于内存,因此减少磁盘IO是数据库性能优化的关键。B+树的设计极大程度上优化了磁盘IO操作:

  • 节点存储多个数据:B+树的每个节点通常代表一个磁盘块或数据页。在访问节点时,能够一次性读取多个数据项到内存,充分利用磁盘的顺序读特性(磁盘顺序读的速度远高于随机读)。这意味着,在每次访问磁盘时,可以处理更多的数据,从而减少了总的磁盘IO次数。
  • 减少磁盘读取层级:由于B+树的高度较低,访问根节点到叶子节点的路径也较短,意味着进行一次查询需要的磁盘读取次数较少。相对于B树或者其他数据结构,B+树在实际的查询操作中减少了磁盘IO,极大提高了查询速度。
磁盘页的概念

B+树的每个节点对应于数据库的一个磁盘页(典型的大小为4KB或8KB)。当执行查询时,数据库会将这些页从磁盘加载到内存中。因此,B+树的结构能够最大化地利用磁盘的读取效率,将多个索引项集中在同一个磁盘页中,减少磁盘的读取次数。

3. 有序性与范围查询

B+树的一个显著特性是所有的叶子节点按顺序排列,并且每个叶子节点都通过指针连接形成链表。这使得 B+树非常适合数据库中的 范围查询,这一点是哈希索引等其他数据结构无法比拟的。

  • 范围查询的高效性:由于叶子节点是有序的并通过指针链接起来,当我们执行诸如 SELECT * FROM users WHERE age BETWEEN 20 AND 30; 这样的范围查询时,只需找到第一个满足条件的叶子节点,然后顺序遍历后续的叶子节点,直到满足结束条件。整个过程无需遍历整棵树,显著提升了范围查询的效率。
  • 顺序扫描的支持:B+树的叶子节点链接使得顺序扫描非常高效,尤其是在执行 ORDER BY 或类似的查询时。数据库可以直接顺序读取叶子节点,避免了随机读取的开销。

4. 非叶子节点不存储数据

与 B 树不同,B+树的非叶子节点只存储键值信息,而不存储实际的数据记录。所有的数据都存储在叶子节点中。这样的设计带来了多项好处:

  • 更高的分支因子:由于非叶子节点只存储键值(而不是数据),它们可以容纳更多的键值,意味着每个非叶子节点的分支数更高,B+树的高度相对较低。树的高度越低,查询路径越短,访问节点的次数也就越少,性能自然更高。
  • 简化叶子节点的结构:所有的数据都存储在叶子节点中,使得叶子节点易于维护,插入、删除数据时,非叶子节点的调整变得相对简单,只需要维护键值的排序和链接关系。

5. B+树与 B 树的对比

B+树与 B 树在结构和性能上有一些显著的差异,B+树被认为更适合数据库场景:

  • 范围查询效率:B 树的非叶子节点和叶子节点都可以存储数据,但这些数据是分散的,范围查询时需要在整个树中做遍历。而 B+树的叶子节点按顺序排列,指针相连,范围查询只需扫描叶子节点,性能更优。
  • 存储效率:B+树的非叶子节点不存储数据,意味着非叶子节点可以容纳更多的键值,导致树的高度更低,从而减少查询的路径长度。B 树的非叶子节点存储数据会导致节点的分支数减少,树的高度增加,查询时需要更多的磁盘访问。
  • 树的高度更低:B+树的每个非叶子节点可以包含更多的指向下层节点的指针,导致其深度更低。较低的树高度意味着更少的磁盘IO和更快的查询性能。

6. 插入和删除的效率

B+树在插入和删除数据时同样具有优异的性能,因为它能够通过分裂和合并节点来保持树的平衡:

  • 插入操作:当一个节点满时,B+树会将节点分裂,并将中间值提升到父节点中,从而保持树的平衡。由于非叶子节点不存储实际数据,只存储索引项,分裂后的非叶子节点可以保持较高的分支度,从而减少树的深度。
  • 删除操作:删除操作时,如果某个节点中的数据项减少到一定程度(低于某个阈值),B+树会通过合并节点来保持平衡性,从而避免树的高度增加。在删除过程中,B+树的非叶子节点无需存储数据,只需维护键值和指针关系,因此删除效率较高。

7. 维护操作

B+树需要定期维护,例如重建索引或更新统计信息。然而,由于其结构的稳定性和自动平衡机制,B+树的维护相对简单。MySQL 提供了 ANALYZE TABLE 和 OPTIMIZE TABLE 等工具来分析和优化索引,使得B+树在数据库管理中易于维护,进一步保证了查询性能。

结论

MySQL 选择 B+树作为索引结构,是因为它具备优秀的平衡性、适合磁盘存储的特性,以及在查询(尤其是范围查询)中的高效性。B+树能够最大限度地减少磁盘IO,提高查询性能,支持高效的插入和删除操作,并且在大规模数据场景中保持性能的稳定性。这些特性使得 B+树成为 MySQL 索引数据结构的最佳选择。

mysql为什么要使用B+树作为索引 1 概述 大家可能在面试的时候都会被问到这样一个问题:mysql的索引结构是什么?这个时候了解的都知道是B+树,那么为什么会采用B+树作为它的索引结构呢? 由图可以知道:索引的存在时为了加快数据访问提高查询效率的,而数据存储在磁盘中,但从磁盘读取数据会产生大量的IO操作,读取效率是非常低的。所以在读取的时候要减少io量和减少io次数来提高读取效率。 ... 阅读详情

相关推荐

版图学习汇总十一(DRC、LVS注意事项)

esd。

weixin_56071389的博客 2262

mysql为什么使用b+树

MySQL 使用 B 树有以下几个原因: 查询效率高:B 树的查询时间复杂度是 log(n) 级别的,相比链表和二叉树的 O(n),性能要高得多。 支持范围查询:B 树能够支持范围查询,这在 MySQL 中经常用于 WHERE 子句中的 BETWEEN 和 IN 运算符。 支持索引和排序:B 树可以用来实现索引,而且在查询时能够保证结果的有序性。 支持动态扩展:B 树可以动态地向两侧扩展,...

weixin_42588555的博客 2078

金蝶K3系统物料主数据后台表对应字段一览

我们说到物料表,一般是指t_icitem,但正确的说t_icitem并不是一张有,而是一张视图,不过我们对于数据库物料表中的大部分操作,都是通过此视图来完成。比如经常通过此视图,来成批修改数量,单价精度,是否启用批次等一些字段,有的时候,对于账套已经启用,并且已经有业务发生的物料,有一些关键属性也需要通过修改物料表t_icitem来进行。 当然修改的时候,需要考虑一些前提条件的。 比如说我有一个客户新建的账套,在月底结账时发现,要改一种成本核算方法,启用时用的是加权平法,现在想改成移动平均法,这样的情况,

hzfw2008的博客 1万+

mysql为什么要用b+树

mysql为什么要用b+树

qq_40263124的博客 6231

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 333

粒子群算法实战:用Matlab解决旅行商问题(TSP)的完整代码解析

本文提供了使用粒子群算法解决旅行商问题的完整Matlab实战指南。通过将连续空间的粒子群算法进行离散化改造,采用基于交换序的策略来更新粒子位置与速度,并给出了从问题定义、数据结构设计、核心函数实现到主迭代循环的详细代码解析。文章还探讨了参数调优、性能优化及处理复杂TSP变体的进阶思路,为物流规划、路径优化等领域的工程应用提供了可直接复用的解决方案。

m2n3o4p5的博客 349

MySQL为什么使用B+树,而不是B树?

在MySQL中,B+树被广泛应用于索引结构,因为它支持高效的范围查询和区间扫描,并且有助于减少磁盘I/O操作,从而提高查询效率。B+树相对于B树来说,其内部节点只存储键值信息,而不存储数据信息,这样可以让每个节点能够存储更多的键值信息,从而使得查询同一层次的所有数据时,能够一次性读入更多的数据块,减少磁盘I/O操作。由于B+树的非叶子节点只存储键值信息,而不存储指向数据的指针,因此当进行范围查询时,只需要遍历B+树的叶子节点即可,而不需要遍历非叶子节点,大大加快了查询速度。

jkzyx123的博客 4690

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

397

MySQL 索引底层为什么用 B+ 树?看完这篇文章,轻松应对面试

面试开始,直入正题。面试官: 你知道 MySQL 索引底层数据结构为啥用 B+树?而不用 B 树、红黑树或者普通二叉树?我: 这事谁知道作者咋想的?他可能是用 B+树习惯了,个人爱好吧。面试官: 你倒是挺看得开。今天的面试就先到这吧,后面有消息会主动联系你。我: 要知道 MySQL 索引底层数据结构为啥用 B+树,先要了解一下什么样的数据结构更适合建索引。为了保证数据安全性,一般都是把数据存储在磁盘里面。当我们需要查询数据的时候,需要读取磁盘,就产生了磁盘 IO,相比较内存操作,磁盘 IO 读取速度是非常慢

m0_73311735的博客 198

ORCAD 层次化原理图使用TCL获取位号的方法

orcad tcl 获取occurrence位号的方法。

m0_46675718的博客 1125

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 776

MySQL底层为什么选择用B+树作为索引

跳表底层实质就是可以进行二分查找的有序链表。而且在链表基础加上索引层。即能支持插入、删除等动态操作,也支持按区间高效查询。而且不管是查找、插入、删除对应的时间复杂度都是O(logn)。要理解跳表,先来看链表,假设链表存储是有序的数据,我们要想查询某一个数据,在最差的情况下要从头全遍历整个链表,时间复杂度是O(n)。从上图所示,我们如果要查询一个26的节点,跳表就可以先从索引层遍历,当遍历到在索引层的21节点,会发现下一个索引层的节点是36节点时,很明显要找的26的节点就在这区间。

qq_71416673的博客 1616

深入理解鸿蒙输入子系统驱动:HDI接口、HAL层与内核驱动的协同机制

/ 扫描输入设备// 打开指定输入设备// 关闭指定输入设备// 获取指定设备信息// 获取所有设备列表鸿蒙输入子系统驱动采用分层架构设计,通过HDI接口层实现硬件抽象,HAL层提供统一的事件处理机制,用户空间驱动层负责设备管理和事件分发。整个系统支持多种输入设备类型,包括触摸屏、按键、鼠标、键盘等,并提供了完整的HID设备支持。分层架构:清晰的层次划分,便于维护和扩展事件驱动:基于epoll的高效事件处理机制设备管理:完善的设备生命周期管理HID支持。

m0_67505153的博客 209

MySQL优化-使用B+树作为索引的数据结构

MySQL优化-使用B+树作为索引的数据结构

weixin_45226668的博客 910

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

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

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

B+树是一种自平衡的树数据结构,它是B树的一种变种。多路平衡查找树:B+树是一种多路查找树,每个节点可以有多个子节点,而不是二叉树那样只有两个子节点。通过这种方式,B+树可以存储更多的元素,从而减少树的高度,提高查找效率。所有数据都在叶子节点:在B+树中,非叶子节点只包含键值信息,数据不存储在这些节点中,数据存储在叶子节点上。因此,B+树的查找效率较高,因为所有的数据访问都是通过叶子节点进行的。叶子节点之间有链指针:B+树的叶子节点之间通过链指针连接,这使得范围查询(例如查询某个区间的数据)变得非常高效。

一碗黄焖鸡三碗米饭的博客 902

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql索引

索引的本质是 帮助MySQL高效获取数据的的。

Enriquze的博客 420

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

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

【MySQL】如何判断索引是否生效?索引失效的情况?为什么Mysql用B+树做索引而不用B-树或红黑树

1、如何判断索引是否生效? 答:在查询语句前加上explain。 explain函数作用:显示了MYSQL如何使用索引来处理select语句以及连接表。 explain select id , name table where name like 'abc%' 2、索引失效的情况 2.1、条件中有or 2.2、like以%开头 2.3、存在索引列的数据类型隐式转换 2.4、where子句中对索引列有数学运算 2.5、where 子句里对有索引列

历乱的日记簿 1万+

为什么MySQL采用B+树作为索引

一文带你详细剖析为什么MySQL采用B+树作为索引

Need not to know 488

MySQL索引之王:B+树全方位解析!揭秘数据库的底层选择

最后思考💡 随着SSD的普及,B+树会淘汰吗?🔍 不会!顺序访问仍快于随机访问(5-10倍)页面读取机制依然有效范围查询优势不可替代未来趋势:B+树 + SSD = 如虎添翼!行动指南:使用查看你的B+树状态,探索INDEX TREE部分!欢迎在评论区分享你的发现。🚀。

全栈开发工程师 1357

(1)MYSQL索引之MySQL索引数据结构为什么使用B+树

本次应该算是一个小系列,分为三节。描述一下Mysql的索引底层的原理的一些知识,,第一节主要分析总结一下对于MySQL索引数据结构为什么使用B+树这种数据结构呢? 对于这个问题,我们着重讨论这么几种数据结构,hash存储,二叉平衡树存储,B树存储,B+树存储,为什么Mysql最终在这些数据结构终选择了B+树这种数据结构呢?我们用https://www.cs.usfca.edu/~galles/visualization/这个网站来构建数据结构图。 1、hash存储 上图是一个长度未11的哈希表,每次在.

LWQ0825的博客 305

MySQL:MySQL索引结构为什么选用B+树?

二叉查找树(BST)、平衡二叉树(AVL)、红黑树、B树和B+树详解

永远保持随时离开的技术能力! 1907

MySQL 索引与 B 树、B+ 树介绍

MySQL 索引与 B 树、B+ 树介绍

闲余知道 808

MySQL的索引结构为什么是B+树?

博客主页:🏆看看是李XX还是李歘歘🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今天的内容是 MySQL的索引结构为什么是B+树? ⛽️💻💻💻 先来看一下树的演化: 树:非线性结构,每个节点有唯一的一个父结点和多个子结点(子树),为一对多的关系。 二叉树:每个结点最多有两颗子树,并且子树有左右之分,不能颠倒。 满二叉树:每一层的结点个数都达到了当层能达到的最大结点数。 完全二叉树:除了最...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 5975

MySQL底层为什么要选用B+树作为索引的数据结构呢?

在数据库中,数据的自增是一个很常见的形式,比如一个表的主键是id,而主键一般默认都是自增的,如果采取二叉树这种数据结构作为索引,那上面介绍到的不平衡状态导致的线性查找的问题必然出现。因此,简单的二叉查找树存在不平衡导致的检索性能降低的问题,是不能直接用于实现 Mysql 底层索引的。1。

jishuxhengjiu的博客 1108

MySQL的存储引擎InnoDB选择了B+ 树

我们知道数据的存储和检索是两个很重要的功能,当我们的数据量大了,怎么能快速的检索数据呢,答案是使用索引,可索引具体的技术实现有很多,选择哪一种呢,我就以mysql为例记录下它为什么选择了B+树作为索引的实现方式。 1. 索引简介   索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 ...

董广明的博客 1422

MySQL 高级 - 第七章 | 索引的数据结构

MySQL官方对索引的定义为:索(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。索引的本质:索引是数据结构,可以简单理解为排好序的快速查找数据结构,满足特定查找算法,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。索引是在存储引擎中实现的。

xhmico的博客 1599
上一篇: mysql的索引详解
下一篇: go相对于java的一些优势
yymagicer
博客等级 码龄13年 1425粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

yymagicer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值