MySQL为什么选择B+树

为什么 MongoDB 索引选择B树,而 Mysql 选择B+树 前言 之前有人看了我的博客提出了这个问题,我懒省事让他自行百度,今天发现网上的答案很多,但是很啰嗦或者让人看不懂,所以就写下了这篇文章 一、B树和B+树的区别 很明显,我们要想弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。 1、B树 B树是一种自平衡的搜索树,形式很简单: 这就是一颗B树。针对我们这个问题的最核心的特点如下: (1)多路,非二叉树 (... 阅读详情

欢迎来到

“我知道平时一般不用,但我就是要考你” 系列

MySQL为什么选择B+树?


一、前言

在我们日常开发中,MySQL 用得最多的存储引擎是 InnoDB,而它默认的索引结构就是 B+树(B+Tree)。

那么问题来了:

✅ 为什么不是哈希表?
✅ 为什么不是二叉树?
✅ 为什么不是B树而偏偏是B+树?

这篇文章,深入浅出地聊一聊:MySQL 为什么选择了 B+树?


二、B+树的核心特点

简要特性:

  • 所有数据都存储在叶子节点。
  • 非叶子节点只存储键值(不存数据),用于索引查找。
  • 所有叶子节点通过链表连接,范围查询效率极高。
  • 每个节点可以存放多个 key,层级更少,查找路径更短。

👇 简化示意图如下:

叶子节点有数据,链表连接


三、为什么不是其他结构?

3.1 为什么不是二叉树?

  • 二叉查找树(BST) 在数据不平衡时会严重退化成链表,查询效率变 O(log n) ➡ O(n)。
  • 虽然可以用 AVL树 / 红黑树 做自平衡,但节点太小、层数太多,IO次数多,不适合磁盘存储。

缺点:磁盘友好性太差


3.2 为什么不是哈希索引?

  • 哈希索引虽然查找快(O(1)),但它不支持范围查询。
  • 比如你想查询 age between 20 and 30 —— 哈希索引完全做不到。
  • InnoDB 的主流查询场景中,范围查很常见。

缺点:不支持范围查询


3.3 为什么不是B树(Basic Tree)?

B树和B+树的区别在于:

特性B树B+树
数据存储所有节点只存储在叶子节点
查找路径有点不统一所有查找都走到底
范围查询需要遍历多个分支叶子链表一次扫完
IO次数相对较多相对较少

B树和B+树对比图👇
在这里插入图片描述

所以,B+树相比 B树,更适合范围查询、磁盘IO少、叶子节点结构更稳定。


四、为什么适合磁盘存储场景?

磁盘访问的特性决定了一点:一次IO,要尽可能读多点内容!

  • B+树的每个节点大小可以设计成与一个磁盘页大小一致(如16KB)。
  • 一个节点里可以塞下上百个 key,大大降低了树的高度。
  • 这样一来,查找某个值时最多只需 2~3 次磁盘 IO,极其高效!

举个栗子:

如果有 1000 万行数据,使用 B+树索引只需约 3 次磁盘IO,就能定位到目标值!


五、总结:为什么选择 B+树?

指标是否满足?说明
快速定位✅多叉树+低层级
范围查询✅叶子节点链表遍历
支持排序✅中序遍历天然有序
IO友好✅每个节点可对应一个磁盘页
插入删除效率✅平衡性强,节点分裂/合并机制成熟

所以 MySQL 使用 B+树,是经过深思熟虑的权衡——

🌟 它并不是最优解,但它是 “适合数据库场景” 的最佳方案。


六、最后 :MySQL索引一定是B+树吗?

答案是:

不是!

  • InnoDB:主键索引 & 二级索引 👉 全是 B+树
  • Memory 引擎:支持 Hash 索引
  • FullText、Spatial 索引:使用倒排索引、R树等

所以选择什么索引结构,其实依赖于存储引擎和使用场景。


【PyQt】使用PyQt6基于Scenedetect制作视频场景自动分割应用 通过详细介绍PySceneDetect的功能和应用,本文阐释了如何利用这一工具提高视频编辑的效率。我们讨论了安装方法、命令行使用示例以及如何在Python脚本中集成PySceneDetect。此外文章还涵盖了基于PyQt6的图形界面设计,通过多线程技术处理视频,保证界面的响应性,并通过实时反馈机制提升用户体验。无论是专业的视频制作团队还是个人爱好者,PySceneDetect都提供了一种可行的、效率高的场景检测工具,让视频编辑工作变得更加简单快捷。 阅读详情

相关推荐

OPC UA 服务端的模拟工具及客户端工具

详细介绍如何使用 Prosys OPC UA Simulation Server 作为 OPC UA 服务端的模拟工具来生成数据模型,并使用 Softing OPC UA Client 作为客户端工具,直观地查看和验证模拟生成的数据。

weixin_44462773的博客 9786

Mysql为什么使用B+树索引

B+树是一种有序的数据结构,所有的数据都按照特定的顺序排列在树的节点中。综上所述,B+树作为一种高效的索引结构,具有有序性、磁盘访问优化、高效的插入和删除操作、快速的索引扫描、良好的平衡性、支持高并发以及易于扩展和维护等优点,这些优点使得B+树成为MySQL选择的理想索引结构。当插入或删除数据时,B+树只需要调整路径上的少数节点,而不需要整颗树的重构。MySQL使用B+树作为索引结构,主要是基于B+树在多个方面的优势,这些优势使得B+树特别适用于数据库索引的场景。

xuweilin的博客 728

告别繁琐同步:Zotero与Obsidian双向联动新方案(基于Better BibTeX与MarkDBConnect)

本文详细介绍了一套基于Better BibTeX、Bibnotes Formatter和MarkDBConnect插件的Zotero与Obsidian双向联动方案。该方案通过建立智能数据通道,实现文献信息的自动同步与笔记的增量更新,解决了手动同步的繁琐问题,并支持在两大工具间无缝跳转,极大提升了科研和知识管理的工作效率。

weixin_29213827的博客 632

mysql为什么要用b+树

mysql为什么要用b+树

qq_40263124的博客 6229

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 173

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

Mysql的索引为什么用的是B+树?

在我们的印象中,mysql数据表里无非就是存储一行行的数据。跟个excel似的。直接遍历这一行行数据,性能就是O(n),比较慢。为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n))。但问题就来了,查询数据性能在 lg(n) 级别的数据结构有很多,比如redis的zset里用到的跳表,也是lg(n),并且实现还贼简单。那为什么mysql的索引,不使用跳表呢?我们今天就来聊聊这个话题。B+树的结构在这里,我简单总结下B+树的结构。B+树查询过程如上图,一般B+树是由多个页组成的多层级结构,每个

jjc4261的博客 1234

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 287

Mysql为什么使用B+Tree

Mysql为什么使用B+Tree

weixin_49349744的博客 1537

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)新增用户和用户角色权限

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)查看用户权限、新增用户和用户角色权限。

念兮为美 7475

YOLO系列算法改进 | 自研篇 | C3k2融合Circulant Attention注意力模块 | 给局部特征提取器装上了全局动态卷积核,兼顾效率、精度与泛化能力!| AAAI 2026

YOLO系列算法改进 | 自研篇 | C3k2融合Circulant Attention注意力模块 | 给局部特征提取器装上了全局动态卷积核,兼顾效率、精度与泛化能力!| AAAI 2026 (以YOLO26最新目标检测模型为基础,融合C3k2_Circulant创新模块改进Backbone)

2502_91881744的博客 235

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

一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么MySQL索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希望听听我的见解。 另外,我花了1个多星期把往期的面试题解析配套文档准备好了,一共有10万字,想获取的小伙伴可以在我的煮叶简介中找到。 1、B树和B+树 一般来说,数据库的存储引擎都是采用B树或者B+树来实现索引的存储。首先来看B树,如图所示。 B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二

Tom弹架构 1715

点云从入门到精通技术详解100篇-基于三维点云的机器人抓取位姿检测(续)

集到的深度信息会存在噪点,因此需要将生成的场景点云进行预处理,获得平滑、降采样处理场景点云,本文设计的预处理操作更能从冗杂的场景点云中提取清晰、平滑的目标点云,便于后续的抓取位姿采样,提高后续算法的处理效率。因此需要对场景点云进行适当的分割,仅保留目标物体的点云,整个过程可以通过。场较小时,空间中的点云密度会更加提高;觉子系统的效率,再保持全局点云几何形状不改变的前提下,通过对目标点云进行。体素降采样可以快速地减少点云数据并同时保持点云的形。个点,由于我们实施抓取的目标物体只占整个场景点云图的一部分,

getusushu的博客 761

mysql b树 io 读取_为什么 MongoDB 选择B树,Mysql 选择B+树?

本文献给准备面试或者是还在面试的你。常见面试题,送分题目,不拿白不拿。一、B树和B+树的区别很明显,我们想向弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。1、B树B树是一种自平衡的搜索树,形式很简单:这就是一棵B-树。针对我们这个问题的最核心的特点如下:(1)多路,非二叉树(2)每个节点既保存索引,又保存数据(3)搜索时相当于二分查找其他的基本上都是一...

weixin_33563262的博客 193

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

为什么MySQL会选择B+树作为索引

B+树通过减少磁盘I/O次数、支持高效的范围查询、提高空间利用率以及保持树的平衡,为MySQL提供了强大的索引支持,使其能够高效地处理大规模数据的存储和查询任务。在实际应用中,无论是InnoDB存储引擎、聚集索引与非聚集索引,还是分区表技术,B+树都发挥着不可或缺的作用。MySQL作为广泛使用的关系型数据库管理系统,其核心存储引擎InnoDB选择B+树作为其索引结构,这一选择背后蕴含了深刻的性能和存储效率考量。本文将简要介绍B+树的基本概念,阐述MySQL选择B+树的原因,并通过实际案例展示其应用。

德乐懿的博客 1121

VC中sqlite的使用

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

为什么MySQL 要选择 B+树

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。再直白点就是我们可以把索引理解成图书或者字典的目录。既然索引是数据的一种存储结构,那么我们必然要对其进行存储,同时,建立索引的目的就是为了加快查询速度,所以必然要选择一种可以高效查询的数据结构来进行存储,而 MySQL 选择了什么数据结构来存储索引呢?

一个双子座的Java攻城狮 512

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

m0_54258715的博客 1494

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

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

qq_71416673的博客 1615

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

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

埃泽漫笔 1346

MySQL 索引为什么要选择 B+ 树

前言: 每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的。server 层主要包括连接器、查询缓存,分析器、优化器、执行器。存储层主要是用来存储和查询数据的,常用的存储引擎有 InnoDB、MyISAM,MySQL 5.5.5 版本后使用 InnoDB 作为默认存储引擎。 连接器 ...

An丶的博客 383

MYSQL-索引结构介绍、为什么选择B+树而不是B树

看了很多讲B树和B+树的文章,大多都是围绕各自的特性讲的,第一,树中每个结点最多含有m个孩子(m>=2);第二,……我也是从这些文章里弄懂了各种树的联系与区别,要真写,我可能还不如人家写得好。所以就在这里简明扼要的用几张图记录一下主要区别吧。 为了便于说明,我们先定义一条数据记录为一个二元组[key,data],key为记录的键值,key唯一;data为数据记录除key外的数据。 ...

z69183787的专栏 2万+

mysql 为什么最终选择了b+ 树

1.MySQL的底层数据结构是 B+ 树,为什么会选择B+ 树呢? 而不是 链表、hash表、红黑树、B树 这些数据结构呢? 链表:链表的随机读的时间复杂度是 O(n) ,不支持范围查询,当遇到范围查询时,只能一个一个的去遍历。 hash表: 要想使时间复杂度保持在 O(1),就需要优秀的 hash 算法,让数据均匀分布在散列表中。 因为数据在散列表中是均匀分布的,所以没有顺序,即 hash 表不支持范围查询。 hash表需要大量的内存空间,将索引全部都加载到内存中。 红黑树: 这里要稍稍、

骑着蜗牛向前跑的博客 257

Mysql索引为什么选择B+树

Mysql索引底层数据结构(B+树) 索引是放到内存中还是在磁盘中? 磁盘,虽然内存的读取速度很快,但是我们还是把索引存放到磁盘上,这样的话,当我们在硬盘上进行查询时,也就产生了磁盘的IO。相比于内存的存取来说,磁盘的IO存取消耗的时间要高的多。但是数据是在磁盘中的,因为放到内存中的话有可能导致数据丢失,另一个原因是内存相对于磁盘来说更加珍贵,不会有太多的内存让我们当数据库来使。所以索引也存储在磁盘中,通过索引来使磁盘IO减少,从而提高效率。 其实在使用B+树作为索引的底层结构之前我们可以考虑一下我们之前学

liulong999的博客 363

mysql b树 外键_为什么 MongoDB 选择B树,Mysql 选择B+树?

本文献给准备面试或者是还在面试的你。常见面试题,送分题目,不拿白不拿。一、B树和B+树的区别很明显,我们想向弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。1、B树B树是一种自平衡的搜索树,形式很简单:这就是一颗B-树。针对我们这个问题的最核心的特点如下:(1)多路,非二叉树(2)每个节点既保存索引,又保存数据(3)搜索时相当于二分查找其他的基本上都是一...

weixin_27977279的博客 932

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

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

Zero_pl的博客 980

二叉树、B树(B-树)、B+树、B*树详解,以及为什么MySQL选择B+树做索引

温故而知新,可以为师矣。看到一篇介绍B数和B减树的文章,这里记录一下。 1. 简要 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 2. 二叉树 先介绍一下二叉搜索树。 顾名思义,二叉搜索树,即指最多拥有两个叉,这里的叉即为所有非叶子结点的儿子(Lift和Right); 所有的结点存储一个关键字; 非叶子结点的左指针指向小于其关键字的结点,右指针指向对于其关键字的结点,结构如下图: 二叉搜索树的搜索,从根结点开始,如果查询的关...

zzhongcy的专栏 4424
上一篇: CAS的原理及应用
下一篇: Redis 为什么快
大西瓜和香蕉
博客等级 码龄6年 29粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值