经常听说单表不能存太多数据, 如果单表数据太多,性能就会下降得比较厉害
本就探索精神, 去搜索了下由来.
对于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次数。
参考资料
评论 (0)