在https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html的官方MySQL文档中找到的信息与https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html版本8的手册中显示的信息不匹配。
第一个链接说64kb的限制被取消了,第二个链接说它存在。
当查看MariaDB时,它变得更加混乱,因为MariaDB的文档没有给予任何限制(当然存在)。
在https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html的官方MySQL文档中找到的信息与https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html版本8的手册中显示的信息不匹配。
第一个链接说64kb的限制被取消了,第二个链接说它存在。
当查看MariaDB时,它变得更加混乱,因为MariaDB的文档没有给予任何限制(当然存在)。
2条答案
按热度按时间shyt4zoc1#
你混淆了几个不同的界限。
MySQL对给定行的大小有64 KB的限制(不包括BLOB/TEXT/JSON)。这个限制仍然存在。
MySQL用于将表的元数据存储在扩展名为
.frm
的文件中。这并不存储任何行,但它存储了元数据,即成为SHOW CREATE TABLE
的大部分内容。表名,列,数据类型,约束,默认值,字符集,元数据注解等。.frm
文件的一部分也被限制为64 KB,但这与64 KB的行大小限制无关。大小相同的事实实际上是一个巧合。这个博客更详细地介绍了这个主题:https://www.percona.com/blog/understanding-the-maximum-number-of-columns-in-a-mysql-table/.frm
文件在MySQL8.0中被废弃了,因为他们用数据字典重新实现了元数据系统。在第二个链接中,没有提到46 KB的大小限制。有一个提到MySQL有每个表4096列的限制,但这与行的大小限制或元数据的大小限制无关。你是否误解了这一点?
就MariaDB而言,它是MySQL的一个分支,因此许多限制仍然与MySQL在分支时的限制相同。https://mariadb.com/kb/en/innodb-limitations/声明:
MariaDB对所有列的组合大小施加了65,535字节的行大小限制。如果表包含BLOB或TEXT列,则在此计算中仅计算9 - 12字节,因为它们的内容是单独存储的。
65,535字节等于64 KB。
也就是说,MariaDB与MySQL不同。MariaDB于2010年从MySQL派生,随着时间的推移,MariaDB与MySQL越来越不兼容,两种产品都在不考虑保持兼容性的情况下进行更改。例如,MariaDB仍然使用
.frm
文件,因为它们在新的数据字典实现之前很久就从MySQL派生了。gpfsuwkq2#
苹果vs橘子
.frm
文件 * 被 * 限制为64KB。该文件在8.0中不再存在。该文件在8.0中实现内部数据字典时消失。它现在是内部InnoDB表集。注意:8.0只支持ENGINE=InnoDB。MariaDB,据我所知,仍然使用
.frm
文件作为“数据字典”,即使是InnoDB。frm可以被认为是
CREATE TABLE
的副本(以某种方式编码)。因此,一个包含大量长名称列、ENUM和INDEX的表可能会超过64KB。(我认为这样的体积是糟糕的模式设计的标志。)在8.0的内部DD中,没有等效的限制。在所有情况下,对各种名称(列,表,索引)的字符长度都有限制。有些限制为64,有些允许更多。字符集似乎停留在utf8mb3。也就是说,64个字符的列名 * 可能 * 与192 * 字节 * 一样大。
MyISAM不应该被使用。它已经从8.0中删除了。但是它仍然有用于表定义的
.frm
文件。因此,从8.0文档中删除是清理与MyISAM相关的cruft的问题。MariaDB仍然支持MyISAM,并且 * 可能 * 有一个未记录的64KB的限制。