MySQL 数据库表中的最大记录数

Posted

技术标签:

【中文标题】MySQL 数据库表中的最大记录数【英文标题】:Maximum number of records in a MySQL database table 【发布时间】:2011-02-12 13:26:31 【问题描述】:

mysql 数据库表的记录上限是多少。我想知道自动增量字段。如果我添加数百万条记录会发生什么?如何处理这种情况? 谢谢!

【问题讨论】:

至少如果内存服务,限制是由存储引擎设置的,所以(例如)使用 MyISAM 你会得到与使用 InnoDB 不同的限制。 @Onion-Knight:我不同意。在一个表中插入几百万行是很正常的,有些数据库确实有限制,所以值得一问。如果有人问 MySQL 是否支持数百万个 ,那可能是架构错误的迹象。 【参考方案1】:

整数的最大值与表中可以存储的最大行数关系不大。

确实,如果您使用 int 或 bigint 作为主键,则您只能拥有与主键数据类型中唯一值的数量一样多的行,但您不必将主键设为键入一个整数,您可以将其设为 CHAR(100)。您还可以在多个列上声明主键。

除了行数之外,还有其他对表大小的限制。例如,您可以使用具有文件大小限制的操作系统。或者你可以有一个 300GB 的硬盘驱动器,如果每行大小为 1KB,则只能存储 3 亿行。

数据库大小的限制真的很高:

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

MyISAM 存储引擎支持每个表 232 行,但您可以使用 --with-big-tables 选项构建 MySQL,使其支持每个表最多 264 行.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

InnoDB 存储引擎每个表都有一个内部 6 字节行 ID,因此最大行数等于 248 或 281,474,976,710,656。

InnoDB 表空间也有 64 TB 的表大小限制。有多少行适合这取决于每行的大小。

64TB 限制假定默认页面大小为 16KB。您可以增加页面大小,从而将表空间增加到 256TB。但我认为,在您将表扩大到该大小之前,您会发现其他性能因素使这很不明智。

【讨论】:

废话 - 我希望我以前能读过这篇文章......我的一张桌子刚刚超过了我的 64 TB 大小,现在我的系统太慢了! @Tom,InnoDB 是 MySQL 5.5 中的默认存储引擎,在 99% 的情况下是更好的选择。 @Ext3h, Sphinx Search 通常是比 MyISAM 或 InnoDB 中的全文索引更好的选择。 对于 mysql 8,限制为 256 TB,页面大小为 64 KB。 @tonix 实际的答案是 64 位整数很容易以长整数类型存储在 C++ 代码中。除此之外,除了主键之外,还有整数的用途。【参考方案2】:

链接http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

行大小限制

给定表的最大行大小由几个因素决定:

即使存储引擎能够支持更大的行,MySQL 表的内部表示最大行大小限制为 65,535 字节。 BLOB 和 TEXT 列仅占行大小限制的 9 到 12 个字节,因为它们的内容与行的其余部分分开存储。

适用于本地存储在数据库页面中的数据的 InnoDB 表的最大行大小略小于 4KB、8KB、16KB 和 32KB innodb_page_size 设置的半页。例如,对于默认的 16KB InnoDB 页大小,最大行大小略小于 8KB。对于 64KB 页面,最大行大小略小于 16KB。请参阅第 15.8.8 节,“InnoDB 表的限制”。

如果包含可变长度列的行超过 InnoDB 最大行大小,InnoDB 会选择可变长度列用于外部页外存储,直到该行符合 InnoDB 行大小限制。对于存储在页外的可变长度列,本地存储的数据量因行格式而异。有关更多信息,请参阅第 15.11 节,“InnoDB 行存储和行格式”。

不同的存储格式使用不同数量的页眉和尾数据,这会影响可用于行的存储量。

有关 InnoDB 行格式的信息,请参阅第 15.11 节,“InnoDB 行存储和行格式”和第 15.8.3 节,“InnoDB 表的物理行结构”。

有关 MyISAM 存储格式的信息,请参阅第 16.2.3 节,“MyISAM 表存储格式”。

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

【讨论】:

【参考方案3】:

Row Size Limits

The maximum row size for a given table is determined by several factors:

MySQL 表的内部表示具有最大行大小 65,535 字节的限制,即使存储引擎能够 支持更大的行。 BLOB 和 TEXT 列仅贡献 9 到 12 字节朝向行大小限制,因为它们的内容被存储 与行的其余部分分开。

InnoDB 表的最大行大小,适用于数据 本地存储在数据库页面中,略小于半页。例如,默认 16KB InnoDB 页面大小的最大行大小略小于 8KB,这是由 innodb_page_size 配置选项定义的。 “Limits on InnoDB Tables”。

如果包含可变长度列的行超过 InnoDB 最大行大小,InnoDB 会选择可变长度列用于外部页外存储,直到该行符合 InnoDB 行大小限制。 本地存储的可变长度列的数据量 页外存储因行格式而异。有关详细信息,请参阅 “InnoDB Row Storage and Row Formats”。 不同的存储格式使用不同数量的页眉和尾数据,这会影响可用于行的存储量。

【讨论】:

【参考方案4】:

我建议,永远不要删除数据。不要说表是否超过 1000 截断表的末尾。您的计划中需要有真正的业务逻辑,例如该用户处于非活动状态的时间。例如,如果超过 1 年,则将它们放在不同的表中。您可以在缓慢的时间中每周或每月在维护脚本中执行此操作。

当您在表中遇到许多行时,您应该开始对表进行分片或分区,并按年份将旧数据放入旧表中,例如 users_2011_jan、users_2011_feb 或使用月份的数字。然后更改您的编程以使用此模型。也许创建一个信息较少的新表来汇总较少列中的数据,然后仅在您需要更多信息时(例如当用户查看他们的个人资料时)参考更大的分区表。所有这些都应该非常仔细地考虑,因此将来重新分解不会太昂贵。您也可以只将一直访问您网站的用户放在一个表中,而将从未访问过的用户放在一组存档的表中。

【讨论】:

这方面看MySQL分区很有用:dev.mysql.com/doc/refman/5.6/en/partitioning.html【参考方案5】:

在 InnoDB 中,表大小限制为 64 TB,MySQL 行大小限制为 65,535,可以有 1,073,741,824 行。这将是利用最大行大小限制的最小记录数。但是,如果行大小较小,则可以添加更多记录。

【讨论】:

要存储这么多 (1,073,741,824) 行,行数限制为 65535,需要多少硬盘?请建议 仅根据行数和row-size无法确定所需的硬盘大小。表大小本身将为 64 TB。但是,TEXT 和 BLOB 列的数据与行分开存储,需要额外的空间。此外,它将取决于 TEXT 和 BLOB 列的数量和类型,因为大小因类型而异。有四种类型的 TEXT 列,即 TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。 BLOB 列也有 TINYBLOB、MEDIUMBLOB、BLOB 和 LONGBLOB 四种类型。【参考方案6】:

根据http://dev.mysql.com/doc/refman/5.6/en/features.html 中的可扩展性和限制部分, MySQL 支持大型数据库。他们将 MySQL Server 与包含 5000 万条记录的数据库一起使用。一些用户使用的 MySQL Server 有 200,000 个表和大约 5,000,000,000 行。

【讨论】:

如果您也让我们知道“他们”正在使用什么样的硬件,这可能会有所帮助 确实,你说得对。但不幸的是,“他们”对硬件一无所知 @myaccount_ram 很抱歉这个死灵法,但如果它有帮助的话,我已经看到生产 MySQL 的理论较少,实际限制更多。我在 2x db.r4.16xlarge AWS 实例(1 个读取器,1 个写入器)上看到了一个大约 180 亿行的数据库。每台机器都有 64 个 CPU 内核、488GB 内存、25Gbps 网络链接、64TB 磁盘。这种规模的数据库推动了 CPU 和磁盘大小的限制,AWS 不提供任何更大的数据库优化实例。它被一个不需要那么多行的更简单的数据库模式所取代。【参考方案7】:

没有限制。它仅取决于您的可用内存和系统最大文件大小。但这并不意味着您不应该采取预防措施来解决数据库中的内存使用问题。始终创建一个脚本,该脚本可以删除未使用的行,或者在特定图形中保留总行数,比如一千行。

【讨论】:

删除您认为“未使用”的行是危险的,并且会导致比解决的问题更多的问题。我的一个项目的前一位开发人员实施了一个脚本,该脚本删除了三天前的购物车,认为他在做正确的事情。你猜怎么着,它每周都会引起问题。仅在确实需要时才删除数据。 一个更糟糕的情况是当有人开始在数据库中存储文件路径时......干草我所有的项目文件都去哪里了......我有一个从 3.5M 文件开始的小项目猜猜是什么...它们并不都经常使用。【参考方案8】:

mysql int 类型可以做很多行:http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

无符号int最大值为4,294,967,295 无符号bigint 最大值为18,446,744,073,709,551,615

【讨论】:

2147483647 max,所以如果您正在处理数十亿个条目,您只需要进行自动增量 bigint 吗? (这可能会让你的选择语句在那之前很久就消失了) @Tchalvak 用于签名 int,请阅读 mysql 文档。 问题的上下文是关于自动增量字段是否可以处理很多行,而不是其他资源的限制 发帖者没有询问数字或任何其他数据类型。 .我真的不明白如何将其标记为正确答案。虽然我必须承认这个问题是模棱两可的,但我们应该区分 PK 数据类型和表的最大行数。 @Bery,OP 通过选择这个作为他们的答案来区分他们所追求的。显然,他们对我的答案涵盖的自动增量字段的容量感兴趣,而不是其他资源的限制。

以上是关于MySQL 数据库表中的最大记录数的主要内容,如果未能解决你的问题,请参考以下文章

1.表的聚合查询(和平均最大最小值)

mysql 一张表中如何查询某个字段最长值的那条记录?

MySQL字段及常用函数

【数据库】请问Access数据库中的表最大能存放多少行记录?

一个mysql数据库, 最大可以支持多少个表数

sql 查询以列出数据库中每个表中的记录数和表大小