InnoDB主键索引的B+tree高度为多高
1. 逻辑存储结构
根据逻辑存储结构,页是组成区的最小单元,页也是InnoDB 存储引擎磁盘管理的最小单元,
每个页的大小默认为 16KB,我们的数据库中表中的每一行数据都是存储在一个个页(Page)中的
2. InnoDB的主键索引属于聚集索引
InnoDB的主键索引属于聚集索引(Clustered Index)
聚集索引的特点:是必须有,而且只有一个 。
聚集索引的含义:将数据存储与索引放到了一块,索引结构的叶子 节点保存了行数据
通俗来讲:聚集索引代表的是 数据都是存储在叶子节点中的。
3. 计算InnoDB主键索引的B+tree高度为多高
假设:
一行数据大小为1k,一页中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数为8。
可以把B+tree树想象成倒立的树
高度为2:
n * 8 + (n + 1) * 6 = 16*1024 , 算出n约为 1170
1171* 16 = 18736
假设主键为n个,那指针个数就是n+1个。一页能存储16行数据,一行数据1k,所以就是16x1024个字节数,
算出一页能存储多少的数据,然后反向计算出n的值为1170,也就是主键为1170个,那么指针数就是1171个。
一个指针指向一个页,一页能存储16行数据,一行数据是1K,所以是1171x16=18736 (Kb) ≈ 18000行数据。
也就是说,如果树的高度为2,则可以存储 18000 多条记录。
注意:
上面的n代表的是主键,指针永远比主键多一位,所以是n+1。
(1170是算出的主键的数量)
(1170+1就是算出的一个非页子节点所拥有的指针数量)
1个指针指向一个页,一个页能存储16K的数据(一行1K数据)
所以高度为2的情况下 = 一个非子页节点拥有1171个指针 * 16 = 1171 * 16 = 18736行数据
高度为3:
1171 * 1171 * 16 = 21939856
因为一个非子页节点拥有1171个指针,一个指针指向一个页,一个页可以存储16KB的数据
所以高度为3的情况下,顶级节点,有1171个指针,指向的每一个节点又有1171个指针,
所以1171个非子页节点 * 1171个子页节点 * 16 = 1171 * 1171 * 16
也就是说,如果树的高度为3,则可以存储 2200w 左右的记录。