B+树能存多少数据

106 阅读2分钟

B+树能存多少数据?

B+树能存多少数据?

int型

图 MySQL B+树示意图

InnoDB页的大小默认是16KB:

  • 假设一条记录大小为1KB,则一个数据页中可以存16条数据(忽略页中的其他数据结构)
  • 假设主键为int,又指针大小为6B,则一个索引页中可以存储16KB/(4B+6B)≈1638个索引

所以,两层的B+树可以存储:16*1638=26208条数据;三层的B+树可以存储:16*1638*1638=42928704条数据。

其实储存计算有一个前提,我们要先假设主键ID的大小和一行数据的大小: 我们假设主键ID为bigint类型,8字节。 一行数据大小为1K左右。 这样我们那么一个页可以存放 16 行这样的数据。 数据页16K是一个包含文件头/页头/页尾等结构的数据页。 所以以上只是估算。


bigint 类型

那非叶子节点呢? 其实这也很好算,我们假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。

所以我们每个非叶子结点最多有1170个子节点。

那么可以算出一棵高度为 2 的 B+ 树,能存放 1170*16=18720 条这样的数据记录。

根据同样的原理我们可以算出一个高度为 3 的 B+ 树可以存放: 1170117016=21902400 (2100万)条这样的记录。

那如果四层呢:那就是117011701170*16=256亿。大部分的InnoDB的B+树都是3到4层,3层的性能会更好。

如果主键是4字节,或者一行的数据更少的情况下,那么同样的层数能储存的行数会更多。

现在我们知道了,最多能存放多少数据不是固定的。一般来说我们为了保持3层的B+数层数,大概是千万级的数据量。