为什么MySQL单表不不建议超过2000W?

易小灯塔
2021-02-05 / 0 评论 / 583 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年10月09日,已超过413天没有更新,若内容或图片失效,请留言反馈。

经常听说单表不能存太多数据, 如果单表数据太多,性能就会下降得比较厉害

本就探索精神, 去搜索了下由来.

对于MySQL数据库单表最大行数的说法,常见的限制是约为2千万行(或2000万行),但这个数字并不是MySQL官方的硬性限制。实际上,MySQL的表的最大行数和大小受到多个因素的影响,包括硬件资源、操作系统限制、配置设置以及数据类型和索引的使用等。

这个2kw是个建议值,我们要来看下这个2kw是怎么来的

单表行数限制

单表行数理论最大值是多少。

我们设计表的时候, 往往需要设置一个主键, 常见的id就是主键。

如果主键声明为int大小,也就是32位,那么能支持2^32-1,也就是21个亿左右。

如果是bigint,那就是2^64-1,但这个数字太大,一般还没到这个限制之前,磁盘先受不了

如果我把主键声明为 tinyint,一个字节,8位,最大2^8-1,也就是255

如果我想插入一个id=256的数据,那就会报错

也就是说,tinyint主键限制表内最多255条数据。

结论: 主键本身唯一,也就是说主键的大小可以限制表的上限。

表的索引

索引内部是用的B+树,最大行数2kw的由来是基于B+树索引结构和页的大小进行估算的。下面是重新整理的说明:

假设使用B+树作为索引结构,并且每个页的大小为15KB。在B+树中,叶子节点存储实际的行数据,每条行数据大小假设为1KB。一个页可以容纳的行数为y=15。

我们可以使用公式 (x ^ (z-1)) * y 来计算行总数,其中x为每个非叶子节点的分支因子(即每个非叶子节点的子节点数),z为B+树的层级数。

假设B+树是两层,即z=2,我们需要确定分支因子x的值。假设每个页的大小是15KB,由于叶子节点和非叶子节点的数据结构相同,我们假设剩下的15KB可以用于非叶子节点。因此,x可以计算为15KB除以每个非叶子节点大小的估计值。假设每个非叶子节点大小与叶子节点大小相同,即1KB。则x=15KB/1KB=15。

已知x=15,y=15,z=2,代入公式 (x ^ (z-1)) y,可以计算出行总数为 (15 ^ (2-1)) 15 = 2万行。

因此,这个2万行是指在B+树索引结构下,每个表的建议最大行数。

在两层B+树的结构中,通过合理的分支因子和页大小设置,建议的最大行数为2万行。超过这个行数,可能会影响查询性能和磁盘IO次数。

参考资料

https://juejin.cn/post/7116381265300815903

0

评论 (0)

取消