【 innoDB 主键索引的B+tree高度为多高呢?】

innoDB 主键索引的B+tree高度为多高呢?

一、首先要知道数据库中一页是多少(16k)

1页是16k
每1k是1024字节

二、然后要知道B+tree的数据结构,

数据结构是:多路平衡二叉树:根节点:只存储key、指针(每个指针都会指向一页),而指针永远都会比key多一个----->叶子节点:1.所有的元素都会出现在叶子节点中并形成一个单向链表(mysql中为双向链表)2.叶子节点才会存储数据

三、知道了B+tree的数据结构后

带入第一点,一页存储16k ,1k 为1024字节,带入第二点 根节点只存储key、指针,假设key的类型bigint(8字节),mysql中一个指针占6字节,
根据以上信息,计算一个高度为2的b+tree的数据存储量,的公式为:n8+(n+1) * 6 = 102416

n 是key的个数 8是数据类型占的字节数
(n+1)是指针的个数(因为指针永远比key多一个故为n+1) 6是指针占的字节数
1024*16 总字节数 16384

问题:n 需要等于多少才能 * 8+n * 6 约等于16384呢
假设n = 1000
1000 * 8+1001 * 6 = 14006 ,这个结果接近 16384
经过多次假设最终得出以下
再假设 n = 1170
1170 * 8 + 1171 = 16386, 这个结果约等于16384了

也可以这样计算
key占8字节,指针占6个字节 8+6=14个字节,16384/14 约等于 1170

没错了,根节点大概可以存储1170个key跟1171个指针

那么,每个指针指向一页,每一页16k,共有1171个指针,就共有1171页,在每页存储16条数据的情况下,高度为2的b+tree 最终存储的数据条数是1171*16=18736条
数据

如果B+tree高度为3层

那么 只需要在乘以一个1171,如:1171 * 1171 * 16 = 21939856
解释: 高度为3的B+tree, 最上面那层可以存1171个指针,每个指针指向一页,指向第二层 就有1171页,其中每一页存储1171指针指向第三层 第二层1171页 乘以第三层的1171 页然后再乘以每页记录条数16条数据(假设一条数据1k一页可以存16条)
得出1171 * 1171 * 16 = 21939856

你可能感兴趣的:(mysql,b树)