- b+树一般一个节点有几个子节点?b+树有几层?为什么?InnoDB中一棵B+树能存多少行数据?
InnoDB 一棵 B+ 树可以存放多少行数据?
这个问题的简单回答是:约 2 千万。
为什么是这么多呢?
因为这是可以算出来的,要搞清楚这个问题,我们先从 InnoDB 索引数据结构、数据组织方式说起。
InnoDB 存储引擎也有自己的最小储存单元——页(Page),一个页的大小是 16K。
假设一行数据的大小是 1k,那么一个页可以存放 16 行这样的数据。
如果数据库只按这样的方式存储,那么如何查找数据就成为一个问题,因为我们不知道要查找的数据存在哪个页中,也不可能把所有的页遍历一遍,那样太慢了。
所以人们想了一个办法,用 B+ 树的方式组织这些数据。
这里我们先假设 B+ 树高为 2,即存在一个根节点和若干个叶子节点,那么这棵 B+ 树的存放总记录数为:根节点指针数 * 单个叶子节点记录行数。
上文我们已经说明单个叶子节点(页)中的记录数 =16K/1K=16。(这里假设一行记录的数据大小为 1k,实际上现在很多互联网业务数据记录大小通常就是 1K 左右)。
其实这也很好算,我们假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。
所以一个两层的B+树,大约可以存放1000+页面;每个页面16个数据,那么最终就有存放 1170*16=18720 条这样的数据记录。
根据同样的原理我们可以算出一个高度为 3 的 B+ 树可以存放: 1170117016=21902400 条这样的记录。
所以在 InnoDB 中 B+ 树高度一般为 1-3 层,它就能满足千万级的数据存储。