MySQL 单表可以放多少数据,最多 2000 万?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
关于单表能存多少数据,阿里 JAVA 开发手册提出,建议最大 2000 万。 然后也看过一篇文章,可以往单表塞 1 亿。 当然,以上其实都有一些理论支撑,但是都不全面,也没有结合具体实际的场景。 这篇文章,结合之前学习的知识,进行一个整体汇总,并贴合实际场景展开。 不 BB,上文章目录。 01 理论知识B+ 树MySQL 的底层结构用 B+ 树存储,这个估计地球人都知道。 为了便于后续讲解,先普及几个概念:
下图是聚集索引,3 层 B+ 树的结构: 虚线部分,可以找到对应页码的数据,这里很基础,不去过多解读。 页存储B+ 树节点的存储结构是 “页”,一页的大小 16 KB。 下面是页结构示意图: 再看看对页结构的解读: 那一页能留多少存储空间呢? 除了 User Records 和 Free Space 以外所占用的存储是 38 + 56 + 26 + 8 = 128。 当新记录插入到 InnoDB 聚集索引中时,InnoDB 会尝试留出 1/16 的页面空闲以供将来插入和更新索引记录,所以就只剩下 15/16。 可存储空间 = 15/16 * 1024 - 128 = 15232 字节。 这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot3 + Vue 的电商系统(Github标星60K),后端支持多模块和 2024最新微服务架构 ,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能! 项目演示: 行存储MySQL 的数据是行存储,MySQL 5.6 默认行格式为 COMPACT(紧凑),5.7 及以后的默认行为 DYNAMIC(动态)。 下面是行结构示意图: 再看看对行结构的解读: 02 叶子节点计算3 层 B+ 树最大数据量前面说了,我们的 B+ 树是 3 层,第一层就一个根节点,能存放 X 个指针。 第二层的每个节点,也能存放 X 个指针,指向第三层 X 个节点。 第三层的每个节点,存放 Y 个数据。 3 层 B+ 树最大数据量 = x ^ 2 * y。 叶子节点总数 x ^ 2 计算我们先看一页能存储多少个指针索引。 每一条索引记录当中都包含了当前索引的值 、一个 6 字节的指针信息 、一个 5 字节的行标头,用来指向下一层数据页的指针。
假设我们的主键 id 为 bigint 型,也就是 8 字节。 索引指针大小:8 + 6 + 5 = 19 字节。 前面已经算出,每页可存储空间 15232 字节。 单页可存储索引指针:15232 / 19 ≈ 801 条。 那算上页目录的话,按每个槽平均 6 条数据计算的话,至少有 801 / 6 ≈ 134 个槽,需要占用 268 字节的空间。 把存数据的空间分一点给槽的话,我算出来大约可以存 787 条索引数据。 单页数据存储索引指针:
叶子节点总数:
03 总记录数计算溢出页前面提到过,MySQL 行存储格式包括 COMPACT 和 DYNAMIC,我们这里只看 DYNAMIC。 DYNAMIC 怎么理解? 在一行数据中,当某列太长时,叶子节点无需将该数据直接存储 ,而是存储指向该数据的指针,真实数据全部存储在溢出页。 使用 DYNAMIC 格式,较短的列会尽可能保留在 B+ 树节点中,从而最大限度地减少给定行所需的溢出页数。 那 COMPACT 呢? COMPACT 行格式则是将前 768 个字节和 20 字节的指针存储在 B+ 树节点的记录中,其余部分存储在溢出页上。 这里我们只讨论 DYNAMIC 情况。 最少总记录数前面我们提到,最大行长度略小于数据库页面的一半,之所以是略小于一半,是由于每个页面还留了点空间给页格式的其他内容,所以我们可以认为每个页面最少能放两条数据,每条数据略小于 8 KB。 如果某行的数据长度超过这个值,那 InnoDB 肯定会分一些数据到 溢出页当中去了,所以我们不考虑。 那每条数据 8 KB 的话,每个叶子节点就只能存放 2 条数据。 在主键为 int 的情况下, 最多总记录数假设我们的表是这样的:
先来分析一下这张表的行数据:无 null 值列表,无可变长字段列表,需要算上事务 ID 和指针字段,需要算上行记录头。 每行数据占用空间:4 + 4 + 4 + 6 + 7 + 5 = 30。 每个叶子节点存放:15232 ÷ 30 ≈ 507。 算上页目录槽位所占空间,每个叶子节点可存放 502 条。 在主键为 int 的情况下, 04 实际场景上面的场景是两个极端, 我们看一个具体的示例。
分析一下这张表的行记录:
再看看字段内容信息:
统计上面的所有分析,共占用 869 字节,则每个叶子节点可以存放 15232 ÷ 869 ≈ 17 条,算上页目录,仍然能放 17 条。 主键为 bigint, 阅读原文:原文链接 该文章在 2025/7/7 11:39:52 编辑过 |
关键字查询
相关文章
正在查询... |