mysql B+树层高计算《嘀嗒出行面试》

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

本文需要有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型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值