MySQL基于MyISAM表的元数据存储的64 kb大小限制不清楚-MySQL和MariaDB之间的差异

2vuwiymt  于 2023-04-19  发布在  Mysql
关注(0)|答案(2)|浏览(139)

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的文档没有给予任何限制(当然存在)。

shyt4zoc

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派生了。

gpfsuwkq

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的限制。

相关问题