Innodb引擎中B+树一般有几层?能容纳多少数据量?
1、页
在 MySQL 中 InnoDB 存储引擎的最小存储单元是页(大小默认是16k,可通过参数设置)。页可用于存放B+树叶节点数据,也可用于存放B+树非叶节点的 “键 + 指针”(也就是路径节点)。
在查找数据时一次页的查找代表一次 IO,一般B+树高大约为1~3层,所以通过主键索引查询通常只需要 1~3 次 IO 操作即可查找到数据。
2、二分查找
索引组织表通过非叶节点的 “二分查找” 法以及指针确定数据在下一层的哪个页中,进而再去叶节点的数据页中查找到所需数据。
3、指针
一个非叶节点可容纳约1170个指针
4、 案例
假设一行记录数据大小为 1k,那么底层叶节点一页16k就能存16条记录。所以:
在2层B+树中,叶节点数*一个叶节点能存放的记录数 = 1170 * 16 = 18720条 记录数
在3层B+树中,叶节点数*叶节点数*一个叶节点能存放的记录数 = 1170 * 1170 * 16 = 21902400,2190w 条记录数
为什么MySQL用B+树而不用B树呢?
因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO 操作变多,查询性能变低。
总结:
B+树叶子和非叶子结点的数据页都是16k,且数据结构一致,区别在于叶子节点放的是真实的行数据,而非叶子结点放的是主键和下一个页的地址。
B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还行。
存储同样量级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。
索引结构不会影响单表最大行数,2kw也只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。
单表最大值还受主键大小和磁盘大小限制。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)