Q:在实际工作中自然环境中,InnoDB 中一棵 B  树数据信息数据库索引一般有多少层?可以 储放多少钱行数据信息?

相关这一难题最近好像在牛客常常普遍到,感觉没啥现实意义,很有可能重要调研的是对 B  数据库查询数据库索引的诠释吧。先上回应:

A:一般是 2 ~ 3 层,可以 储放约 2000万行 的数据信息。

前文读过,页是 InnoDB 磁盘管理的最小单位,在 InnoDB 存储控制模块中,默认 每一个页的规格为 16KB。而页里面置放的东酉就是一行一行的纪录。

如何知道实际生产环境的b树索引有多少层?插图

假设一行数据信息的高矮是 1k,那么一页就可以储放 16 行这样的数据信息。

大家都了解,B  树的叶子节点存储真正的纪录,并不是叶子节点的产生是由于更快速的找寻相符合纪录隶属的叶子节点,因而 可以 简单表述为非叶子节点储放的是键值   表针。这里用表针来描具体以上并没有太精准,精准而言是页的偏位,可是表针更强掌握~

依据sql索引组织表的方式,数据信息行被存储在不一样的页中。如下图所表明:

如何知道实际生产环境的b树索引有多少层?插图1假设我们要从图上这棵 B  绿色植物找寻外键约束是 20 这行数据信息 select * from table where id = 20;

最开始找寻 B  树的根节点,即存储的非叶子节点的页 page_number = 10,在这里页上依据二分查找法以及表针精确精准定位到 id = 20 这行数据信息存在于 page_number = 12 这页上,接着一样的在这儿页上面二分查找就可以快速精确定位 id = 20 这行纪录。

说这类和文题并没有很相关的话题讨论探讨,事实上 就是要想大家掌握:页作为 InnoDB 磁盘管理的最小单位,不仅可以用以储放具体的行数据信息,还可以储放键值和表针

回到题目的含义,大伙儿先从简单的着手,假设 B  树仅有两层,即一个根节点和好几个叶子节点,如下图:

如何知道实际生产环境的b树索引有多少层?插图2

那么对于这棵 B  树能够存储多少钱行数据信息,事实上问的就是这棵 B  树的非叶子节点中存放的数据量,可以运用下面这一简单的公式计算测算来计算

  • 根节点表针数 * 每一个叶子节点储放的行纪录数

每一个叶子节点储放的行纪录数就是每一张储放的纪录数,由于每一个数据分析表中的列名数量都不一样,这里大伙儿都不深究叶子节点的存储结构了,简单按照一行纪录的信息内容规格为 1k 来测算的话(实际上现阶段很多互联网技术技术性业务流程步骤信息内容纪录规格一般 就是 1K 左右),一页也就是说一个叶子节点可以 储放 16 行这样的数据信息。

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

非叶子节点里面存的是主键值   表针,大伙儿假设外键约束的种类是 BigInt,长度为 8 字节,而表针规格在 InnoDB 中设置为 6 字节,那般一共 14 字节。

为了更好地更好的方便快捷创作,这里大伙儿把一个主键值   一个表针称作一个控制模块,这样的话,一页也就是说一个非叶子节点能够储放 16384 / 14=1170 个这类的控制模块。

也就是说一个非叶子节点中能够储放 1170 个表针,即相符合 1170 个叶子节点,因而对于那般一棵高度为 2 的 B  树,能储放 1170(一个非叶子节点中的表针数) * 16(一个叶子节点中的数量)= 18720 行数据信息。

当然,那般分析事实上沒有很仔细认真,按照 《MySQL 技术内幕:InnoDB 存储引擎》中的定义,InnoDB 数据信息页结构包含下列好几个一部分:

如何知道实际生产环境的b树索引有多少层?插图3

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

OK,分析完高度为 2 的 B  树,一样的道理,大伙儿来看高度为 3 的:

如何知道实际生产环境的b树索引有多少层?插图4

根页(page10)可以 储放 1170 个表针,接着第二层的每一页(page:11,12,13)也都分别可以 储放1170个表针。那般一共可以 储放 1170 * 1170 个表针,即相符合的有 1170 * 1170 个非叶子节点,因而 一共可以 储放 1170 * 1170 * 16 = 21902400 行纪录。