本文需要有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型主键的表数据不超过2000w是比较靠谱的选择。
----------------------------------
block size 的概念 数据库引擎每次从磁盘取数据按照page 为单位去取, mysql 默认为16K ,oracle好像是8K。mysql不能通过命令行修改默认页大小,如果必要修改情况下请参考下面链接
----------------------------------------

本文探讨了MySQL中B+树的层高计算,基于默认16K页面大小,分析了int和bigint主键类型的存储能力。建议int类型限制在4000w行以内,bigint类型在2000w行以内,以避免额外的IO操作。同时,文章提到了数据库引擎的block size概念,并给出了估算B+树层高的简单公式。请注意,所有内容为理论推演,未进行实际实验。
最低0.47元/天 解锁文章
174万+

被折叠的 条评论
为什么被折叠?



