Innodb引擎中B+树一般有几层?能容纳多少数据量?

1、页

在 MySQL 中 InnoDB 存储引擎的最小存储单元是页(大小默认是16k,可通过参数设置)。页可用于存放B+树叶节点数据,也可用于存放B+树非叶节点的 “键 + 指针”(也就是路径节点)。

在查找数据时一次页的查找代表一次 IO,一般B+树高大约为1~3层,所以通过主键索引查询通常只需要 1~3 次 IO 操作即可查找到数据。

2、二分查找

索引组织表通过非叶节点的 “二分查找” 法以及指针确定数据在下一层的哪个页中,进而再去叶节点的数据页中查找到所需数据。

3、指针

一个非叶节点可容纳约1170个指针

4、 案例

假设一行记录数据大小为 1k,那么底层叶节点一页16k就能存16条记录。所以:

在2层B+树中,叶节点数*一个叶节点能存放的记录数 = 1170 * 16 = 18720条 记录数

在3层B+树中,叶节点数*叶节点数*一个叶节点能存放的记录数 = 1170 * 1170 * 16 = 21902400,2190w 条记录数

为什么MySQL用B+树而不用B树呢?

因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO 操作变多,查询性能变低。 

总结:

B+树叶子和非叶子结点的数据页都是16k,且数据结构一致,区别在于叶子节点放的是真实的行数据,而非叶子结点放的是主键和下一个页的地址。

B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还行。

存储同样量级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。

索引结构不会影响单表最大行数,2kw也只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。

单表最大值还受主键大小和磁盘大小限制。

 

posted @ 2023-08-28 14:01  yifanSJ  阅读(428)  评论(0编辑  收藏  举报