MYSQL的B+Tree索引树高度如何计算

article/2025/9/17 11:26:06

我们使用MySQL数据库的时候,绝大部分的情况下在使用InnoDB存储引擎,偶尔会使用MyISAM存储引擎,至于其他存储引擎,我相信大家都很少接触到,甚至可能都没有听说过。所以本文只讲解InnoDB和MyISAM两个存储引擎的索引,以及如何计算这两个存储引擎的索引结构B+Tree的高度。

InnoDB

InnoDB主键索引示意图如下,非叶子节点上没有实际的数据,只有叶子节点上才有实际的数据,并且叶子节点之间有指针串联指向下一个叶子节点,这样能够提升范围查询的效率:

InnoDB B+Tree主键索引示意图

InnoDB使用了聚簇索引(Clustered),即所有二级索引聚集在主键索引上,对InnoDB存储引擎表的任何访问,最终一定要搜索主键索引树,二级索引的示意图如下:

 

 

InnoDB B+Tree二级索引示意图

在InnoDB中,二级索引(所有不是主键索引的索引)上没有实际的数据,取而代之的是主键索引的值。这样的话,如果是基于二级索引的查询,会先在二级索引上搜索得到主键索引的值,然后再去主键索引树上搜索,得到最终的行数据。

这就意味着,至少有一次索引查找,可能会有两次索引查找,其中一定有一次主键索引查找。

所以,在InnoDB中,主键要设计的尽量,主键越小,二级索引也会越小。满足需求的情况下,SMALLINT优先于INT,INT优先于BITINT,INTEGER类型优先于VARCHAR类型。如果主键用更大的数据类型,由于二级索引上有主键索引的值,那么不只是主键索引树变的更大更高,其他的二级索引树也会更大更高,这绝对是一个糟糕的做法。

MyISAM

MyISAM没有使用聚簇索引,所以主键就是一个普通的唯一索引,并且基于索引查询只会搜索当前索引,不会和其他索引有任何关系,任意两个索引之间互不影响。如下图所示,是MyISAM的主键索引示意图,我们可以看到,索引树的叶子节点上只有表中行数据的地址,而不是和InnoDB一样,有实际的数据:

 

MyISAM的主键索引示意图

如下图所示,是MyISAM的二级索引示意图,我们可以看到,其结构几乎和主键索引示意图一样,叶子结点上也有表中行数据的地址:

 

MyISAM的二级索引示意图

B+TREE高度

了解B+Tree索引的大概结构后,我们接下来讲解一下如何计算索引树的高度。

我们先做如下假设:

表的记录数是N;

每个BTREE节点平均有B个索引KEY(即1,2,3,4,5… …);

很明显,这时候B+TREE索引树的高度就是logBN(等价于logB/logN)。需要说明的是,这里的对数以及接下来有对数的地方应该是下图中的对数,笔者不知道如何将word中的对数复制过来,所以请将就一下下(尴尬 ̄□ ̄):

对数

另外我们知道,由于索引树每个节点大小固定,所以索引KEY越小,B值就越大,即每个BTREE节点上可以保存更多的索引KEY。并且索引树的高度是logBN,那么B值越大,索引树的高度越小,那么基于索引查询的性能就越高。所以我们可以得到结论:相同表记录数的情况下,索引KEY越小,索引树高度就越小

现在,我们假设表有1600w条记录(因为2^24≈1600w,便于接下来的计算),如果每个节点保存64个索引KEY,那么索引高度就是 (log10^7)/log64 ≈ 24/6 = 4。

所以,由上面的演算可知,我们要计算一张表的索引树的高度,还只需要知道一个节点有多大,从而就能知道每个节点能存储多少个索引KEY。现代数据库经过不断的探索和优化,并结合磁盘的预读特点,每个索引节点一般都是操作系统页的整数倍,操作系统页可通过命令得到该值得大小,且一般是4094,即4k。而InnoDB的pageSize可以通过命令得到,默认值是16k。

关于预读:在索引树上查到某个KEY(例如id=3),需要先找到这个KEY所在的叶子节点(因为B+Tree索引只有叶子节点上有具体的数据),这个查找过程从根节点到叶子节点,需要经过整个树。当找到叶子节点后,会根据预读原理将整个节点数据全部加载到内存中,然后基于二分法找到最终的KEY

OK,到这里,我们距离真正计算一个拥有1600w数据的表的索引树的高度,只差每个索引KEY所占空间了。

以BIGINT为例,存储大小为8个字节。INT存储大小为4个字节(32位)。索引树上每个节点除了存储KEY,还需要存储指针。所以每个节点保存的KEY的数量为pagesize/(keysize+pointsize)(如果是B-TREE索引结构,则是pagesize/(keysize+datasize+pointsize))。

假设平均指针大小是4个字节,那么索引树的每个节点可以存储16k/((8+4)*8)≈171。那么:一个拥有1600w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log10^7)/log171 ≈ 24/7.4 ≈ 3.2。

假设平均指针大小是6个字节,那么索引树的每个节点可以存储16k/((8+6)*8)≈146。那么:一个拥有1600w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log10^7)/log146 ≈ 24/7.2 ≈ 3.3。

假设平均指针大小是8个字节,那么索引树的每个节点可以存储16k/((8+8)*8)≈128。那么:一个拥有1600w数据,且主键是BIGINT类型的表的主键索引树的高度就是(log10^7)/log128 ≈ 24/7 ≈ 3.4。

由上面的计算可知:一个千万量级,且存储引擎是MyISAM或者InnoDB的表,其索引树的高度在3~5之间

说明:这一段对索引树高度的计算,都是基于B+Tree,即InnoDB和MyISAM存储引擎的索引用到的数据结构。而B-TREE索引节点上不仅保存了索引和指针,还保存了具体的行数据,索引树的高度算法略有不同。

 

 

总结

索引树的高度是一个非常重要的东西,因为当查找的条件能用到索引时,就不用全表扫描,而是只需要在索引上搜索,从索引的根节点到叶子节点。并且很明显的是:索引树越高,性能就会越差。我们假设在最糟糕的情况下,索引一点没有被加载到内存中,而是全部持久化在磁盘上。那么索引树有多高,就表示查询至少需要多少次IO操作。即使实际情况中,由于表的数据更多,索引也会很大,不大可能全部被保存在缓存中。而且如果是二级索引搜索,IO次数还要翻倍(二级索引搜索+主键索引搜索),这对性能是一个很大的影响。

这也是MySQL数据库使用B+Tree作为索引结构的原因:尽可能降低索引树的高度。而红黑树等其他数据结构,树的高度要深的多的多。


http://chatgpt.dhexx.cn/article/lxItaU7O.shtml

相关文章

红黑树高度上限的证明(通俗易懂)

先把结论放上,设红黑树的高度为h,总结点数为n,那么h与n的关系就是 下面开始证明过程 首先,从任意节点出发,到其子树的叶子节点的路径中黑色节点的数量称为该节点的黑高,即 bh 我们设根节点为T,那么根节点…

数据结构与算法(一): 树的高度和深度的区别

1.高度 对于高度的理解,我们不管他数据结构什么什么知识,就拿楼房来说,假如一个人提问:楼房的高度有好高?我们会下意识的从底层开始往上数,假如楼有6层,则我们会说,这个楼有6层楼那…

经典PID算法

首先感谢黄工,公众号strongerHuang,以下为三篇文章整合而成。 文章链接: https://mp.weixin.qq.com/s/6Ew431m4nXhScpNVp8mGxQ https://mp.weixin.qq.com/s/JYWnu67HEx2uMrntcUhggQ https://mp.weixin.qq.com/s/IrTehHvTofXWP_BapoN1NQ 在工…

PID控制原理

PID控制原理 在模拟控制系统中,控制器最常用的控制规律是PID控制。 PID控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。 PID控制规律为 数学表达形式为: 进行拉普拉斯变换,写出传递函数的形式: kp为比例系数,T1为积分时间常数,Td为微分时间常数。…

SMART PLC PID算法基本解析(附公式)

在稳态运行中,控制器调节输出值,使偏差 (e) 为零。偏差是设定值(目标值)与过程变量(实际值、反馈值)之差。输出 = 比例项 + 积分项 + 微分项 离散化的PID公式基本框架几乎一样,不同的厂家描述符号,变量名称定义可能不太一样, 从公式中可以看出,积分项是从第一次采样到…

PID算法-理论分析

连续PID算法 典型PID算法框图 r(t):设定状态量y(t):实际状态量e(t):当前误差u(t):控制 器输出 P-比例环节 u p ( t ) K p ∗ e ( t ) K p [ r ( t ) − y ( t ) ] u_{p}(t)Kp*e(t)Kp[r(t)-y(t)] up​(t)Kp∗e(t)Kp[r(t)−y(t)…

PID详解

PID在控制领域应该是应用最为广泛的算法了,在工业控制,汽车电子等诸多领域中运用 下面我用一个例子和算法过程来讲解PID的概念 PID: P比例控制:基本作用就是控制对象以线性的方式增加,在一个常量比例下,动态…

模糊PID算法

在讲解模糊PID前,我们先要了解PID控制器的原理(本文主要介绍模糊PID的运用,对PID控制器的原理不做详细介绍)。PID控制器(比例-积分-微分控制器)是一个在工业控制应用中常见的反馈回路部件,由比例单元P、积分…

PID控制器整理分享

概述 日常开发中,常常需要对速度、温度等物理量进行稳态控制,而在目前的自动化控制原理中,使用最为广泛的方法就是PID控制算法。本文简要整理分享PID控制器的使用。 正文 PID控制器,即比例-积分-微分控制器。它是一个不依赖系统…

PID算法详解

文章目录 什么是pid比例(p)控制积分(I)控制微分(D)控制PID使用增量式PIDC语言实现pid算法 什么是pid PID算法是一种具有预见性的控制算法,其核心思想是: 1>. PID算法不但考虑控制…

《PID》一篇文章带你搞懂使用PID

节选自本人博客:https://www.blog.zeeland.cn/archives/pid-learning 本文为笔者参考了网上众多大神的解析之后加上自己的理解整合起来的,因此在内容上部分参考了其他作者,目的仅用作参考以便更好地学习,如有侵犯,可联…

PID几种公式总结

模拟式PID 其中,t为采样时间 位置式PID 其中,为采样间隔 增量式PID 增量式PID和位置式PID都是数字式PID(模拟式PID的离散化)的不同表达形式,因为计算机只能处理离散数据,将连续信号变为离散信号&#xff…

PID控制及公式讲解

1、PID引入 2、PID代码 /*******************************************************************位置式pid********************************************************************/ double PID(double Actual,double SET){ static double E_sum,Error_last; //上一…

一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)

一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制) PID控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度,大到控制无人机的飞行姿态和飞行速度等等,都可以使用PID控制。这里我们从原理上来理解PI…

PID公式的推导过程及实现代码

一、PID框图: n0(t)是要稳定的值 n(t)是当前输出值 e(t) n0(t) - n(t) 一、模拟PID控制原理 这个公式网络上很好找: 二、数字PID控制 由于模拟的微积分运算对应计算机来说是不太好写代码的,所以要利用采样将数据离散化 于是公式就可以转换…

经典的pid公式,好脑子不如烂笔头。

这个算法涉及昨天,今天,明天。 思路就是以史为鉴,预测明天,改革当前。

PID公式通俗理解

PID调节是有方法、有规律可循的,不过在此之前先深入理解其公式。 别怕,先看认真看PID本体: 其中: u(t) -------------输出曲线,pid输出值随时间的变化曲线 Kp --------------比例系数 e(t)------------- 偏差曲线&…

PID公式

位置型PID: 增量式PID: 增量式PID和位置式PID的优缺点: 位置式PID: u(k)的值和执行机构的位置(如阀门开度)是一一对应的,因此通常称该公式为位置式PID控制算法 缺点&…

PID控制算法01

PID控制算法 PID控制算法公式原理参数作用 PID算法及改进两个基本类型位置型PID控制增量型PID控制 积分环节改进的PID控制积分分离的PID控制变速积分的PID控制抗积分饱和的PID控制 微分环节改进的PID控制不完全微分PID控制微分先行PID控制 PID控制算法公式 原理 PID控制是一种…