树高计算

假设数据库每个数据记录的大小为400字节(50个bigint类型),而用于索引的键占8字节。三层树高(两层索引页,一层数据页)能放多少数据?

页的大小为16k(实际会有其它信息占用大概200字节),这里按16k来算,非叶子节点中,一行记录包括索引的键和指向其它页号的指针(InnoDB指针占6字节),所以一行记录是8 + 6 = 14字节

每页可以包含的键数 = 16384字节 / 14字节 = 1170

每个数据记录400字节,那么一个数据页16k可以存放16384 / 400 = 40行数据

那么两层b+树高则有1170个叶子节点(第一层为一个索引页根节点,然后第二层扩展出1170个数据页叶子节点)每个叶子节点能存放40行数据,即1170 * 40 = 46800行记录

那么三层b+树高则有1170 * 1170 = 1368900 个叶子节点(第一层为一个索引页根节点,然后第二层扩展出1170个索引页叶子节点,然后第三层扩展出1170 * 1170个数据页叶子节点),每个叶子节点能存放40行数据,即 1368900 * 40 = 54756000(五千万?!)

我们不是说三层树高是2000w数据吗,现在算怎么三层树高就能存5000w数据?实际上,2000w的那个数据是每行数据记录大小为1k计算得来的,也就是1024个字节,128个bigint,而我们不是每个表都会定义这么多字段,所以还得根据表的具体情况来计算,而且每个页都需要一定空间存放其它信息,每行也需要存放其它的信息,实际的话还需要考虑这些内存占用