一般来说主键索引的树深度有几层?为什么是这个层数?

MySQL系列:查看索引数的结构(层数、节点数) tools:https://github.com/jeremycole/innodb_diagrams 阅读详情

这是一个非常棒的问题,它触及了数据库索引设计的核心。简单答案是:

对于一个存储了数百万甚至数十亿条记录的大型表,其主键索引的B+树深度通常也只有3到4层。极少有情况会达到5层或以上。

这个看似神奇的层数背后,是B+树数据结构极其高效的高扇出(High Fan-out) 特性。


为什么层数这么少?—— 关键在于“扇出”

扇出(Fan-out) 指的是一个索引节点中可以存储的子节点指针(或键值)的数量。B+树之所以强大,就是因为它的每个节点都能存储非常多的键值和指针,这使得树可以变得“又宽又胖”,而不是“又瘦又高”。

树的深度(层数)直接决定了查找一条记录需要多少次磁盘I/O操作。因为每次向下遍历一层,通常就需要一次磁盘读取(除非节点已被缓存)。所以,保持较浅的深度是高性能的关键。

层数计算:一个具体的例子

让我们用一些合理的假设来估算一下:

  1. 假设1:页大小(Page Size)
    在InnoDB中,默认的页大小是 16KB。这是B+树每个节点的大小。

  2. 假设2:主键字段大小
    假设我们使用一个 BIGINT(8字节) 作为主键。

  3. 假设3:指针大小
    在InnoDB中,一个指向子节点(或数据行)的指针大约需要 6字节。

  4. 计算非叶子节点的扇出
    一个非叶子节点存储的内容是:(主键值 + 子节点指针)。
    每个这样的组合大约占用:8字节 + 6字节 = 14字节。
    一个16KB的页大约能存储:16 * 1024 / 14 ≈ 1170 个这样的组合。
    也就是说,一个非叶子节点可以指向大约1170个子节点。

  5. 计算叶子节点的容量
    叶子节点存储的是完整的行数据(在MySQL的聚集索引中)或主键值+指针(在PostgreSQL的堆表中)。这里我们以MySQL为例,假设一行数据平均大小为 1KB(这是一个很常见的估算值)。
    那么一个16KB的页大约能存储:16 / 1 ≈ 16 行数据。

现在,我们来计算这棵B+树能存储多少数据:

  • 深度 = 1:根节点也是叶子节点。

    • 最多存储 16 行记录。
  • 深度 = 2:1个根节点(非叶子) + 多个叶子节点。

    • 根节点可以指向 1170 个叶子节点。
    • 总记录数 = 1170 * 16 ≈ 18,720 行。
  • 深度 = 3:

    • 根节点可以指向 1170 个非叶子节点。
    • 每个非叶子节点又可以指向 1170 个叶子节点。
    • 总记录数 = 1170 * 1170 * 16 ≈ 21,902,400 行(约 2200万)。
  • 深度 = 4:

    • 总记录数 = 1170 * 1170 * 1170 * 16 ≈ 25,629,807,200 行(约 256亿)。

从这个计算可以看出:

  • 仅仅3层的B+树就能轻松支持两千万级别的数据量。
  • 达到4层,就能支持两百五十亿级别的恐怖数据量,这已经远超绝大多数应用整个生命周期的数据总量。

影响树深度的关键因素

从上面的计算公式可以看出,深度主要由以下几个因素决定:

  1. 页大小(Page Size):这是最重要的因素。页越大,一个节点能存储的键值和指针就越多(扇出越高),树就越浅。MySQL可以配置页大小(如8KB, 16KB, 32KB, 64KB),但16KB是默认且最平衡的选择。
  2. 主键的大小:主键字段越小,每个非叶子节点能存储的键值就越多,扇出就越高。这就是为什么通常推荐使用 短小的自增整数(如BIGINT) 作为主键,而不是很长的字符串(如UUID)。
    • 反面例子:如果你用 CHAR(100) 做主键,假设需要100字节。那么一个非叶子节点只能存储 16*1024 / (100+6) ≈ 154 个键值指针对。扇出从1170暴跌到154,要存储同样多的数据,树的深度就必须增加。
  3. 行数据的大小(仅对MySQL聚集索引影响显著):行数据越小,每个叶子页能存放的行数就越多,整棵树能存储的总行数就越大。因此,避免设计过宽的表、将TEXT/BLOB等大字段分表存储,也有助于优化索引深度。

总结

  • 核心原因:B+树拥有极高的扇出,使得树又宽又胖,而非又瘦又高。
  • 典型层数:对于亿级以下的表,3层是常态。对于十亿到百亿级的表,4层也足够。5层以上的B+树极其罕见,通常意味着表设计可能存在问题(例如使用了非常低效的主键)。
  • 设计启示:为了保持索引树浅而高效,应该使用短小、自增的整数作为主键。这不仅能减少非叶子节点的扇出,还能保证顺序写入,减少页分裂和碎片,对性能提升至关重要。
3.DJI-payload SDK自定义控件的设计: 自定义控件(Widget)是指负载运行时,在用户界面中显示的自定义 UI 控件,以帮助用户快速查看负载独特的设备状态,或者对负载设进行设置。这些 UI 控件可以显示在以下用户界面中。Pilot 2 应用程序;大疆智图;基于 MSDK 开发的应用程序。这种自定义控件并不是通过 MSDK 实现的,而是通过 PSDK 的配置实现的。。 阅读详情

相关推荐

ATE测试的未来:自动化与智能化的技术演进

本文探讨了自动测试设备(ATE)在半导体产业中的技术演进,重点关注自动化与智能化的发展趋势。随着芯片制程的不断进步,ATE面临测试复杂度激增和成本压力等挑战。文章分析了AI技术在测试优化中的应用,如自适应测试和缺陷预测,以及模块化架构和端到端测试生态系统的创新。这些技术突破显著提升了测试效率和设备利用率,为半导体测试的未来发展指明了方向。

weixin_29232507的博客 614

深入理解Mysql索引底层数据结构与算法

深入理解Mysql索引底层数据结构与算法

持续学习,坚持原创,分享技术笔记及经验。 688

记录:MCGS和正弦变频器通讯

触摸屏实现对变频器:启动、停止、频率设定、频率读取、电压读取、电流读取。通讯方式Modbus RTU。

m0_61837027的博客 1024

MySQL调优-剖析MySQL索引底层数据结构与算法

MySQL调优-剖析MySQL索引底层数据结构与算法

Eriksen的博客 1202

一文解读DeepSeek训练数据集

本文重点以DeepSeek为例,详细介绍预训练数据集相关内容。大语言模型LLM(如DeepSeek、ChatGPT、文心一言等)的“智慧”源于它们学习的海量数据集。简单来说,数据集就是模型的“知识库”,通常由互联网公开的文本、图片、视频等。这些数据需满足两个特点:规模大和多样性。规模大是指数据量可达千亿级词汇,让模型学习复杂规律;多样性则涵盖多领域(如科技、文学)、多语言、多形式(对话、新闻),帮助模型适应不同场景。例如,训练数据中既有百科知识,也有日常对话,模型才能既解答专业问题,又能闲聊。

u013891230的博客 7080

CentOS7下Graylog3.0高效日志管理:从零搭建到实战应用

本文详细介绍了在CentOS7操作系统上从零开始搭建Graylog3.0日志管理平台的完整过程。内容涵盖Java环境准备、MongoDB与Elasticsearch依赖安装、Graylog Server核心配置,并实战演示了通过Graylog Sidecar集中管理日志采集器以及配置邮件告警功能,为中小型团队提供了一个比ELK更轻量、易维护的一体化日志解决方案。

weixin_29207149的博客 84

怎么看 InnoDB 的 B+TREE 层数

怎么看 InnoDB 的 B+TREE 层数

wzy0623的专栏 731

AUTOSAR知识点:PDUR(PDU Router)基础知识

通过定义路由表和实现相应的路由和缓冲逻辑,PDUR能够确保PDU在不同ECU之间的可靠传输。在上述示例中,我们定义了一个简单的PDUR路由表,其中列出了源ECU和目标ECU之间的映射关系。当收到来自源ECU的PDU时,PDUR模块会根据路由表查找目标ECU,并将PDU传输到相应的目标ECU。PDUR的主要功能是将接收到的PDU从一个ECU路由到另一个ECU,并确保数据的正确传输。需要注意的是,上述示例是一个简化的实现,实际的PDUR模块可能包含更复杂的功能和逻辑。

EcmFsharp的博客 1156

Pandas分层索引入门教程(详解)

Pandas分层索引入门教程(详解) 分层索引(Multiple Index)是 Pandas 中非常重要的索引类型,它指的是在一个轴上拥有多个(即两个以上)索引层数,这使得我们可以用低维度的结构来处理更高维的数据。比如,当想要处理三维及以上的高维数据时,就需要用到分层索引。 分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单,让抽象的高维数据变得容易理解,同时它比

ccc369639963的博客 3289

BW 技术 InfoObject 初始化,一次把 0LANGU、0CURRENCY、0IOBJNM 这些底座对象讲透

摘要:BW/4HANA和S/4HANA嵌入式分析中最容易被忽视的关键技术InfoObject(如0LANGU、0UNIT等)是系统运行的基础骨架。这些对象虽不直接涉及业务,但若未正确激活会导致多维分析、查询运行等核心功能异常。BW/4HANA中应通过任务清单SAP_BW4_SETUP_SIMPLE或SAP_BW4_SET_OPERATION_SCOPE激活,而非旧事务码RSTCO_ADMIN。S/4HANA嵌入式分析仍需依赖这些底层BW组件,配置需参考SAP Note 2636754。项目实践中需特别关注这

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

Qt C++ 卫星数据接收与处理界面

打开 `MainWindow.ui`,你会发现我们完全是在代码中 (`setupUI`) 创建的 UI。* 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件。* 对于 FFT,可以使用专门的库如 [FFTW](http://www.fftw.org/),或者 Qt 5.15 及以上版本中提供的 `QFFT` 和 `QComplex` 类。

寒寒豆豆软件公司的博客 148

mysql 索引 层数_mysql 索引底层

hash索引o(1) B+树索引 o(logn)为什么红黑树出现了,因为防止某些情况下二叉排序树退化为链表——诞生了二叉排序平衡树——树的性能取决于树的高度为什么DB要用M路B树,为了再降低树的高度,减少db 磁盘io 次数,如果在内存中,红黑树效率更高为什么M不能无限大,因为会退化成有序数组,无法一次载入内存,B树则可以一次加载一个节点B+树在B树的基础上,(1)仅在叶子节点存放数据——B树...

weixin_39771775的博客 810

级联H桥构网型储能SVG系统设计与VSG控制策略研究

随着新能源渗透率不断提高,电力系统惯量和阻尼水平持续下降,传统跟网型控制策略在弱电网条件下的稳定性面临严峻挑战。构网型控制以电压源方式运行,能够为系统提供惯量和频率支撑,成为当前研究热点。本文针对10kV/10Mvar级联H桥构网型储能静止无功发生器(SVG),采用星形连接拓扑结构,设计了基于虚拟同步发电机(VSG)的构网型控制策略。文章从主电路拓扑设计、数学建模、VSG控制策略设计、调制策略、直流电压平衡控制、系统参数设计、仿真建模和硬件实现等八个方面展开系统论述,给出了完整的Simulink仿真模型~~

huanghm88的专栏 347

MySQL索引总结

索引用来加快对数据的访问。 通过B+树 对于不同类型的索引,是和不同的存储引擎相关的。 如果使用的是xx, 是B+树;如果是。。。是哈希表。 不同的存储引擎表示的是不同数据在磁盘的存储形式。 k-v格式的数据。不管任何类型的二叉树,都会让树变高,从而影响了IO的效率。 从而让树变低,从而提高访问速率。 主键索引和组合索引。 存储引擎,数据结构,索引的分类,索引涉及到的常问的几个名词,执行计划,索引优化。 (把该提的点都提到;把细节点都描述清除) 存储引擎 数据在磁盘上的不同组织形式。innodb,myi.

成功唯有积累,没有奇迹。 243

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据库索引基础

B树是一个N叉搜索树,每个节点可以有N个子树,每个节点就可以保存多个子树了。1).一个节点有N个值,就能延伸出N个子树,此时意味着,每个节点最后一个值,就是当前这个树的最大值;2).父节点中的值会在子节点中以最大值的形式出现,此时对叶子节点这一层来说,叶子结点的内容就是整个数据集合的全集;3).针对叶子节点,使用双向链表的形式,把叶子节点连接起来;4).由于当前叶子节点就是数据的“全集”,所以只有叶子节点才能涉及到“数据行”非叶子节点只需要存储“索引列”。

2401_87747173的博客 408

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

关于mysql调优的一些理解记录

尽可能多的减少io量;(减少io次数,减少io量) 局部性原理: 数据和程序都有聚集成群的倾向,之前被查询过的数据可能会被再次查询。 磁盘预读: 在磁盘根内存进行交互的时候有一个很小的逻辑单元,称为页,datapages,页跟操作系统相关,一般情况下是4k或者8k,每次再进行数据交互的时候,一定读取的是页的整数倍。 mysql的innodb在进行数据读取的时候也是和页有关的,datapagesize 默认16kb。 索引是存在磁盘中的,但是会预先加载到内存中,而且在进行加载的时候是分页加载->分块读取

flower_boboji的博客 190

IDEA的使用指南

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

mysql-索引

1.多列索引 语法: ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 ) 如:alter table t_task add unique index(branch_no,task_no);

sinat_34814635的博客 1105

由浅入深理解索引的实现

00 – 背景知识 - B-Tree & B+Tree   http://en.wikipedia.org/wiki/B%2B_tree   http://en.wikipedia.org/wiki/B-tree - 折半查找(Binary Search)   http://en.wikipedia.org/wiki/Binary_search_algorithm - 数据库的性能问题

DBA Tips 1456

多层索引与分组

MultiIndex MultiIndex,即具有多个层次的索引,有些类似于根据索引进行分组的形式,通过多层次索引,我们就可以使用高层次的索引,来操作整个索引组的数据。 创建方式 第一种 我们在创建Series或DataFrame时,可以通过给index(columns)参数传递多维数组,进而构建多为索引。【数组中每个维度对应位置元素,组成每个索引值】多为索引的也可以设置名称(names属性),属...

qq_40949426的博客 1193

mysql索引最多有多少层_MySQL一个索引最多有多少个列?真实的测试例子

MySQL一个索引最多有多少个列?最多16列。create table test (f1 int,f2 int,f3 int,f4 int,f5 int,f6 int,f7 int,f8 int,f9 int,f10 int,f11 int,f12 int,f13 int,f14 int,f15 int,f16 int,f17 int);create index idx_test_16 on te...

weixin_31966453的博客 531

mysql查询索引高度_如何查看MySQL表中指定索引的高度

查看表中指定索引的高度:索引层数的表示法:索引中每个页的结构图:page Header中有个page level的值,这个值保存这个B+树的高度值,由于B+树从0开始算,所以B+树的高度=page level的值再加1由于B+树中是从root页开始查找数据,而root页中的page header中的page level中存储这颗B+树的高度值,所以下面需要查找到指定索引的root页的page_no...

weixin_36368413的博客 353

利用索引提示减少分页的嵌套层数

今天和同事讨论了一下索引扫描避免排序的问题,感觉比较有意思,就简单总结一下。首先要强调的是,这并不是标准的或者推荐的一种分页语句的写法,这种方法需要对表、索引的结构有清晰的认识。而且这种方法的限制条件很多。因此,这里只是单独讨论...

ckawt40802的专栏 113

实际生产环境的 B+ 树索引有多少层?

Q:在实际生产环境中,InnoDB 中一棵 B+ 树索引一般有多少层?可以存放多少行数据? 先上答案: A:一般是2 ~ 3 层,可以存放约两千万行的数据。 计算过程: 页是 InnoDB 磁盘管理的最小单位,在 InnoDB 存储引擎中,默认每个页的大小为 16KB(16*1024 = 16384Byte)。而页里面存放的东西就是一行一行的记录。 假设一行数据的大小是 1k,那么一页就可以存放 16 行这样的数据。众所周知,B+ 树的叶子节点存储真正的记录,而非叶子节点的存在是为...

ThinPikachu的博客 1248

查看mysql索引树的层级

SELECT b.name,a.name,index_id,type,a.space,a.page_no from information_schema.innodb_sys_indexes a, information_schema.innodb_sys_tables b where a.table_id=b.table_id and a.space <>0 ;

wy_gates的博客 1156

如何创建高效的索引

要让创建的索引真正有效,是需要一个过程的,不是系统上线之前调一下就行了,而是需要在系统运行过程中,不断调整。 (1)考虑索引本身的特性 在前面的文章中,已经说了,索引的3个特性:有序、索引层数不高、索引包含字段值。 第一个特性是有序,可以用到sql中的 分组操作(group by),排序操作(order by),关联(join)上。 第二个特性是索引层数不高,说明当一个表的数据量越

SQL Server探索 7108

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 217
上一篇: PostgreSQL 和 MySQL两个数据库的索引的区别
下一篇: 一般来说,数据库表设计必备和备选的字段
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值