心态崩了,我怎么知道实际生产环境的 B+ 树索引有多少层?

深入解析B+树三层设计原理与MySQL索引性能优化实践 数据库索引是提升查询性能的核心技术,其本质是通过高效的数据结构组织,将随机磁盘I/O转化为顺序访问,从而大幅减少数据检索的延迟。B+树作为多路平衡查找树的代表,专门针对磁盘存储特性优化,通过高扇出设计降低树高,使得查询路径稳定可控。在工程实践中,B+树通常设计为三层结构,这源于对存储容量与I/O效率的经典权衡:在常见数据行大小(约1KB)下,三层B+树可支撑约2000万级数据量,且查询仅需2-3次磁盘I/O,实现了性能与存储的最优平衡。结合MySQL InnoDB的页机制与聚簇索引原理,这种设计成为OLTP 阅读详情

Q:在实际生产环境中,InnoDB 中一棵 B+ 树索引一般有多少层?可以存放多少行数据?

关于这个问题最近好像在牛客上经常看到,感觉没啥意义,可能主要考察的是对 B+ 索引的理解吧。先上答案:

A:一般是 2 ~ 3 层,可以存放约 两千万行 的数据。

前文说过,页是 InnoDB 磁盘管理的最小单位,在 InnoDB 存储引擎中,默认每个页的大小为 16KB。而页里面存放的东西就是一行一行的记录。

假设一行数据的大小是 1k,那么一页就可以存放 16 行这样的数据。

众所周知,B+ 树的叶子节点存储真正的记录,而非叶子节点的存在是为了更快速的找到对应记录所在的叶子节点,所以可以简单理解为非叶子节点存放的是键值 + 指针。这里用指针来描其实述不是太准确,准确来说是页的偏移量,不过指针更好理解~

通过索引组织表的方式,数据行被存放在不同的页中。如下图所示:

假设我们要从上图这棵 B+ 树种找到主键是 20 这行数据 select * from table where id = 20;

首先找到 B+ 树的根节点,即存储的非叶子节点的页 page_number = 10,在该页上通过二分查找法以及指针定位到 id = 20 这行数据存在于 page_number = 12 这页上,然后同样的在这页上用二分查找即可快速定位 id = 20 这行记录。

说这些和文题不是很相关的话题,其实就是想要大家知道:页作为 InnoDB 磁盘管理的最小单位,不仅可以用来存放具体的行数据,还可以存放键值和指针。

回到文题,我们先从简单的入手,假设 B+ 树只有两层,即一个根节点和若干个叶子节点,如下图:

那么对于这棵 B+ 树能够存放多少行数据,其实问的就是这棵 B+ 树的非叶子节点中存放的数据量,可以通过下面这个简单的公式来计算:

  • 根节点指针数 * 每个叶子节点存放的行记录数

每个叶子节点存放的行记录数就是每页存放的记录数,由于各个数据表中的字段数量都不一样,这里我们就不深究叶子节点的存储结构了,简单按照一行记录的数据大小为 1k 来算的话(实际上现在很多互联网业务数据记录大小通常就是 1K 左右),一页或者说一个叶子节点可以存放 16 行这样的数据。

那么 B+ 数的根节点(非叶子节点)能够存储多少数据呢?

非叶子节点里面存的是主键值 + 指针,我们假设主键的类型是 BigInt,长度为 8 字节,而指针大小在 InnoDB 中设置为 6 字节,这样一共 14 字节。

为了方便行文,这里我们把一个主键值 + 一个指针称为一个单元,这样的话,一页或者说一个非叶子节点能够存放 16384 / 14=1170 个这样的单元。

也就是说一个非叶子节点中能够存放 1170 个指针,即对应 1170 个叶子节点,所以对于这样一棵高度为 2 的 B+ 树,能存放 1170(一个非叶子节点中的指针数) * 16(一个叶子节点中的行数)= 18720 行数据。

当然,这样分析其实不是很严谨,按照 《MySQL 技术内幕:InnoDB 存储引擎》中的定义,InnoDB 数据页结构包含如下几个部分:

想要深究的小伙伴可以去看书中的 4.4 章节,这里我就不再多分析了。

OK,分析完高度为 2 的 B+ 树,同样的道理,我们来看高度为 3 的:

根页(page10)可以存放 1170 个指针,然后第二层的每个页(page:11,12,13)也都分别可以存放1170个指针。这样一共可以存放 1170 * 1170 个指针,即对应的有 1170 * 1170 个非叶子节点,所以一共可以存放 1170 * 1170 * 16 = 21902400 行记录。

数据库面试八股文进阶:事务隔离、B+树索引与慢SQL优化实战 数据库是后端系统的核心,事务与索引是保证数据一致性和查询性能的基础。理解MVCC版本链与ReadView可见性判断,掌握B+树索引结构及最左前缀原则,才能解释为什么RR隔离级别能抑制幻读、哪些操作会导致索引失效。这些原理直接支撑锁机制和死锁排查,通过SHOW ENGINE INNODB STATUS定位问题,结合EXPLAIN分析慢SQL,优化深分页与覆盖索引。实际选型时,MySQL、Oracle与向量数据库各有适用场景,需要根据业务权衡。全文围绕Java面试高频的数据库知识,从原理到实战形成闭环。 阅读详情

相关推荐

AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)

Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题(例如 Alpha 预测,风险预测,市场动态性建模)。本文旨在记录一些面向初学者的基础内容。

in_void的博客 3133

查看MySQL InnoDB 表索引的高度

在看《MySQL技术内幕:InnoDB存储引擎》B+树索引章节中看到这么一句话: 但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2-4层,也就是说查找某一键值的行记录时最多只需要2-4次IO。因为当前一般的机械磁盘每秒至少可以做100次IO,2-4次的IO意味着查询时间只需要0.02-0.04秒。 那么,当一个表很大的时候,索引还是是2-4层吗?那么这是遍历...

勿忘初心 4387

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1175

阿里:MySQL 单表数据最大不要超过多少行?为什么?

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 594

Unity半透明物体景深失效?教你用双材质球方案完美解决(附完整Shader代码)

本文深入剖析了Unity中半透明物体导致景深效果失效的根本原因,即半透明物体默认不写入摄像机深度图。针对此问题,文章详细介绍了稳定高效的“双材质球”解决方案,通过为物体附加一个仅写入深度信息的不可见材质,完美修复景深效果,并提供了完整的Shader代码与实现脚本。

weixin_29010003的博客 383

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4873

面试题:InnoDB中B+树有几层?

上次腾讯面试问到了这个问题,当时以为是和索引数量有关,下来查了一下资料,有博主好文,所以在这里转载收藏一下,如有侵权,联系删除,感谢! 一、InnoDB 一棵 B+ 树可以存放多少行数据? 这个问题的简单回答是:约 2 千万。 为什么是这么多呢? 因为这是可以算出来的,要搞清楚这个问题,我们先从 InnoDB 索引数据结构、数据组织方式说起。 我们都知道计算机在存储数据的时候,有最小存储单...

璟矢 1万+

EDSR-PyTorch实战:从模型下载到超分辨率图像生成

本文详细介绍了如何使用PyTorch实现EDSR模型进行超分辨率图像生成,包括环境配置、模型下载、参数调优及常见问题解决方案。EDSR作为超分辨率重建的利器,通过深度残差网络显著提升图像质量,特别适合老照片修复等场景。文章还提供了视频处理和自定义训练的进阶技巧,帮助开发者快速掌握这一技术。

weixin_29046035的博客 462

MySQL索引一般不超过3层_Mysql调优-3Mysql的索引

1.Memory用的是hash index,但是InnoDB和MyISAM用的是B+树,不用二叉树的原因就是深度可能过深,深度过深影响查询和IO性能;2.索引使用树的过程:BST:二分查找,不平衡AVL:二叉平衡树,最长子树和最短子树的高度之差不能超过1,数据越多,旋转越多,插入删除效率极低,查询效率比较高,而且树的深度也会比较深红黑树:最长子树不超过最短子树的两倍即可,通过旋转+变色两步操作,损...

weixin_39631261的博客 1820

ESP32系列之LVGL(三):Gui-Guider的使用

Gui-Guider的使用

m0_55986987的博客 2万+

美团mtgsig 1.2算法分析

mtgsig1.2的一些算法总结

记录一些web逆向的过程 3506

搞懂B+树和B-树

转载自:伯乐专栏作者/玻璃猫,微信公众号 - 梦见漫画:什么是b+树 这一次我们来介绍 B+ 树。 一个m阶的B树具有如下几个特征: 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 一个m阶的.

qq30211478的博客 2307

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1120

漫画描述——史上最通俗易懂的B+树和B-树详解!

转载自:伯乐专栏作者/玻璃猫,微信公众号 - 梦见 漫画:什么是b+树 这一次...

油炸嘎啦小丸子 1048

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

B+树真的不难,楼下菜大爷都能学得会的B+树!(数据结构可视化神器推荐

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。本文已被。

2401_84692141的博客 977

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

面试官:请说说 B 树与 B+ 树的原理及区别?

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:Alibaba开源内网高并发编程手册.pdf之前在网上看到过一些B树与B+树的区别然后主要是针对定义来陈述,分分钟看的我快要冬眠,然后在一次面试遇到该没问题没回答上来一首凉凉送 给自己,今天老老实实的分享自己对B树,B+树浅显理解,若望指出不足。B树的原理动态查找树主要包括:二叉搜索树,平衡二叉树,红...

emprere的博客 200

MySQL面试核心:从B+树索引到事务隔离的实战原理剖析

数据库索引是提升查询效率的核心技术,其背后通常采用B+树数据结构。B+树通过其矮胖的多层结构和有序的叶子节点链表,在减少磁盘IO次数的同时,高效支持范围查询和排序操作,这使其成为关系型数据库索引的通用选择。理解索引原理对于实现高性能数据检索至关重要,尤其是在高并发在线事务处理(OLTP)场景下。基于此,联合索引遵循最左前缀原则,合理设计可以避免回表查询,实现覆盖索引,从而极大提升查询性能。同时,数据库通过事务隔离级别和MVCC(多版本并发控制)机制来平衡数据一致性与并发性能,其中可重复读(RR)隔离级别结合

angou6476的博客 384

Linux下学【MySQL】底层存储的秘密---索引(存储引擎到底是什么?聚簇索引和非聚簇索引又是啥?)联合软硬件理解,通俗易懂,图文并茂

本章是MySQL中进阶的部分,通过了解索引知道MySQL底层到底是如何存储数据的,以及MySQL底层中的结构到底是啥,本章主要具体的讲到了索引、MySQL数据如何存储page、存储引擎的结构B+树任何管理page数据、索引的操作(本质其实是主键的操作),最终相信通过本章索引的理解你会对MySQL数据库存储有很大的提升,下期将更新MySQL另一大知识点事务,敬请期待~

溟洵的博客 4071

为什么php说未建立索引_【PHP】为什么 MySQL 添加索引后就可以提高查询速度

遇到这种问题,你就要高度集中,保持空杯心态,脑海里要有以下三个问题为什么添加索引会提高查询速度索引提高了查询速度对增删改有影响索引常用的算法原理分析B树和B+树下面来详细介绍介绍为什么添加索引会提高查询速度一句话回答:索引可以将无序内容转换为有序的一个集合(相对),就如同新华字典,如果没有目录,那么查询一个汉字就需要很长时间了。MySQL 使用的是 Btree 索引,那它是怎么加速检索的呢?检索中...

weixin_34329874的博客 158

mysql 线上加索引_Mysql为什么添加索引可以提高查询速度,看完这篇就够了

这篇文章我会分为以下部分进行讲解,如果你懂了,那么请绕行,别浪费你宝贵时间!只有光头才可以变强,如果你要继续看,请保持空杯心态!为什么添加索引会提高查询速度总结。索引提高了查询速度对增删改有影响吗。索引常用的算法原理分析B树和B+树等。为什么添加索引会提高查询速度一句话回答:索引可以将无序内容转换为有序的一个集合(相对),就如同新华字典,如果没有目录,那么查询一个汉字就需要很长时间了。找到id=8...

weixin_39936792的博客 157

【PHP】为什么 MySQL 添加索引后就可以提高查询速度

遇到这种问题,你就要高度集中,保持空杯心态,脑海里要有以下三个问题 为什么添加索引会提高查询速度 索引提高了查询速度对增删改有影响 索引常用的算法原理分析B树和B+树 下面来详细介绍介绍 为什么添加索引会提高查询速度 一句话回答:索引可以将无序内容转换为有序的一个集合(相对),就如同新华字典,如果没有目录,那么查询一个汉字就需要很长时间了。 MySQL 使用的是 Btree 索引,那它是怎么加速检索的呢? 检索中主要耗时在于内存与磁盘的IO耗时,所以加速的关键在于减少IO的次数。 图中是一

weixin_49163826的博客 322

mysql为什么索引能提高查询速度_【PHP】为什么 MySQL 添加索引后就可以提高查询速度...

遇到这种问题,你就要高度集中,保持空杯心态,脑海里要有以下三个问题为什么添加索引会提高查询速度索引提高了查询速度对增删改有影响索引常用的算法原理分析B树和B+树下面来详细介绍介绍为什么添加索引会提高查询速度一句话回答:索引可以将无序内容转换为有序的一个集合(相对),就如同新华字典,如果没有目录,那么查询一个汉字就需要很长时间了。MySQL 使用的是 Btree 索引,那它是怎么加速检索的呢?检索中...

weixin_29276847的博客 199
上一篇: 缓存热点,缓存穿透,终极解决方案看过来
下一篇: 超详细带你入门开发一个超实用的浏览器插件
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值