💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

【Mysql系列】假设每条sql是1kb,主键id是bigint类型,一棵高度为4的b+树能存储多少数据?_子节点

  • 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
  • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
  • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
  • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
  • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
  • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨


博客目录

  • 假设每条 sql 是 1kb,主键 id 是 bigint 类型,一棵高度为 4 的 b+树能存储多少数据?


假设每条 sql 是 1kb,主键 id 是 bigint 类型,一棵高度为 4 的 b+树能存储多少数据?

在 innodb 存储引擎里面, 最小的存储单元是页 (page) ,一个页的大小是 16KB 。 如果我们在数据库的命令行输入如下命令, 那么可以返回如右图所示。

这就说明了一个页的大小为 16384B, 也就是 16kb。

【Mysql系列】假设每条sql是1kb,主键id是bigint类型,一棵高度为4的b+树能存储多少数据?_子节点_02

假设一行数据的大小是 1k, 那么一个页可以存放 16 行这样的数据 。 那如果想查找某个页里面的一个数据的 话, 得首先找到他所在的页 。 innodb 存储引擎我们都知道使用 B + 树的结构来组织数据 。 如果是在主键上建 立的索引就是聚簇索引, 即只有在叶子节点才存储行数据, 而非叶子节点里面的内容其实是键值和指向数据 页的指针。

因此, 我们首先解决一个简单一点的问题: 那么如果是 2 层的 B + 树, 最多可以存储多少行数据?

如果是 2 层的 B + 树, 即存在一个根节点和若干个叶子节点, 那么这棵 B + 树的存放总记录数为: 根节点指 针数 * 单个叶子节点记录行数 。 因为单个页的大小为 16kb, 而一行数据的大小为 1kb, 也就是说一页可以存 放 16 行数据 。 然后因为非叶子节点的结构是:“页指针 + 键值”, 我们假设主键 ID 为 bigint 类型, 长度为 8 字节 (byte) , 而指针大小在 InnoDB 源码中设置为 6 字节 (byte) , 这样一共 14 字节 (byte) , 因为一个 页可以存放 16k 个 byte, 所以一个页可以存放的指针个数为 16384/14=1170 个 。 因此一个两层的 B + 树可 以存放的数据行的个数为: 1170*16=18720 (行) 。

那么对于高度为 3 的 B+树呢? 也就是说第一层的页, 即根页可以存放 1170 个指针, 然后第二层的每个页也可以 存放 1170 个指针 。 这样一共可以存放 11701170 个指针, 所以一共可以存放 11701170*16=21902400 (2 千万 左右) 行记录 。也就是说一个三层的 B + 树就可以存放千万级别的数据了 。 而每经过一个节点都需要 IO 一次, 把这个页数据从磁盘读取到缓存, 也就是说读取一个数据只需要三次 IO。

继续来说, 高度为 4 的 B+树呢? 11701170117016 约等于 2000 万1000 。 5 个 2000 万是 1 个亿 。 1000 个 2000 万就是 200 亿。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

【Mysql系列】假设每条sql是1kb,主键id是bigint类型,一棵高度为4的b+树能存储多少数据?_主键_03