假设: 一行数据大小为1K(1024字节),一页可以存放16行这样的数据,一页的大小 16 * 1024 = 16384 字节,
InnoDB指针占用6个字节的空间,主键即使为bigint也只占用8个字节的空间
设索引(键)的数量为 n ,键的总占用空间 : 键的数量 * 单个键的占用空间 = n * 8
根据B+tree树的特性,指针的数量比当前节点键的数量多1个,所以
指针的总占用空间 = ( 主键的数量 + 1 ) * 单个指针占用空间 = (n + 1) * 6
计算n 的值 : 每个页所占用的空间为 16384
列出方程 :
n * 8 + (n + 1) * 6 = 16384
14n = 16384 - 1
n = 16383 / 14
n ≈ 1170
现在已经 计算出键的数量为 1170 , 加1 就是指针的数量 1171
一个指针对应一页,一页可以有16行数据,1171 * 16 = 18736 行数据,得出当B+树高度为2的时候可以存储18736 行数据
高度为3的时候呢?
-
高度为2的时候所有的叶子节点只有一个共同的索引节点,高度为3的时候原来的叶子节点变为了索引节点,
-
他们每个都会有1171个指针(把单个索引节点看做根,就可以在根据高度为2的时每个索引的指针数量,就可以求出他们每个最大拥有的指针数量),指向自己拥有的叶子节点
-
在高度为2的时候有1171个叶子节点,所以现在会有1171个索引节点,由于B+树的值都是存储在叶子节点的,所以这里的1171个索引节点是指叶子节点的父节点,并没有算上整棵树的根节点
-
一个索引节点可以存储 18736 行数据,现在有1171个索引节点,所以 18736 * 1171 就可以得出,高度为3的时候可以存储 21939856 行数据,约等于219W行数据