本文需要有mysql底层知识做铺垫
****mysql默认page大小为16K,这个可以调整,但是必须是4的倍数,因为操作系统每次和硬盘交互数据取的就是4K的块
1、分析b+树非叶子节点情况 ,假定一个表用int类型作为主键,占用4个字节,而指针大小在InnoDB源码中设置为6字节,一共10个字节,根节点一页就能存放16K/10 约为1600个指针
满编的B+树一层能存放的指针数据为1600*1600 约为256W条数据,二层大约为4亿数据。
此时B+树高度为4,因为有叶子节点的存在。假定数据表一行实际数据为1k大小(一行数据差不多就是那么大吧,估摸着),叶子结点每一页(page)大概可以放16条数据。所以最终能够放进去的数据为4亿*16,大约64亿行。此时,int主键已经超过最大范围。而且每次查询数据走索引的时候需要经过4次io。所以建议将数据约束在三层树结构中,根节点+一层非叶子节点+二层非叶子节点+三层数据节点。按一条数据1k长度,可存储行数为256W*16 约为 4000w 左右。所以int型主键建议将数据行数约束在4000w以内。超过该界限将会增加一次io。
2、分析b+树非叶子节点情况 ,假定一个表用bigint作为主键 ,占用8个字节,加上指针的6个字节一用14个字节,用16k 16384/14约为1170。那么可以算出一棵高度为2的B+树,能存放1170*16=18720条这样的数据记录。高度为3 1170*1170*16=21902400左右,高度为4的时候 大概是256亿条数据(这些数据大约需要占24T 的硬盘大小 = =!千万别用自己的电脑试)。所以将bigint型