MySQL限制和限制/Mysql的限制/桌上柱数和行大小的限制

12.5桌柱数量和行大小的限制

本节介绍表中列表数量的限制以及单个行的大小。

列计数限制

MySQL每个表具有4096列的硬限制,但给定表格的有效最大值可能较少。确切的列限制取决于几个因素:

  • 表的最大行大小约束列的数字(且可能大小),因为所有列的总长度不能超过此大小。看行大小限制

  • 单个列的存储要求限制了适合在给定的最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。看数据类型存储要求

  • 存储引擎可能会施加限制表列计数的附加限制。例如,Innodb.每桌子限制为1017列。看innodb限制。有关其他存储引擎的信息,请参阅替代存储引擎

  • 功能钥匙件(见创建索引语句)实现为隐藏虚拟生成的存储列,因此表索引中的每个功能键部分都针对表总列限制计数。

行大小限制

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

  • 即使存储引擎能够支持较大的行,MySQL表的内部表示也具有65,535个字节的最大行大小限制。斑点文本列仅向行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。

  • 最大行大小为Innodb.适用于数据库页面本地存储的数据的表略小于4KB,8KB,16KB和32KB的一页innodb_page_size.设置。例如,默认16KB的最大行大小略小于8KBInnodb.页面大小。对于64KB页面,最大行大小略小于16KB。看innodb限制

    如果包含一行可变长度列超过这一点Innodb.最大行大小,Innodb.为外部非页面存储选择可变长度列,直到行适合其中Innodb.行大小限制。用于存储关闭页面的可变长度列本地存储的数据量因行格式而异。有关更多信息,请参阅innodb行格式

  • 不同的存储格式使用不同量的页眉和拖车数据,这会影响来自行的存储量。

行大小限制示例

  • 以下展示了65,535个字节的MySQL最大行大小限制Innodb.myisam.例子。无论存储引擎如何,即使存储引擎可能能够支持更大的行,该限度也是如此。

    MySQL> Create Table T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G VARCHAR(6000))发动机=innodb字符集拉丁仪;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
    MySQL> Create Table T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G VARCHAR(6000))发动机=myisam字符集拉丁in;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs

    在下面的myisam.示例,将列更改为文本避免了65,535字节的行大小限制并允许操作成功,因为斑点文本列仅向行大小贡献9到12个字节。

    MySQL>创建表T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G Text(6000))引擎=myisam字符集拉丁in;查询OK,影响0行(0.02秒)

    该操作成功了Innodb.表,因为更改列到文本避免MySQL 65,535字节行大小限制,Innodb.可变长度列的非页面存储避免了Innodb.行大小限制。

    MySQL>创建表T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G Text(6000))引擎=innodb字符集拉丁仪;查询OK,影响0行(0.02秒)
  • 变量长度列的存储包括长度字节,它们被朝向行大小计数。例如,一个varchar(255)字符集UTF8MB3列需要两个字节来存储值的长度,因此每个值最多可以高达767个字节。

    创建表的陈述T1.成功,因为列需要32,765 + 2个字节和32,766 + 2个字节,其落在65,535字节的最大行大小内:

    MySQL>创建表T1(C1 VARCHAR(32765)不是空,C2 VARCHAR(32766)不是空)引擎= InnoDB字符集拉丁文1;查询OK,影响0行(0.02秒)

    创建表的陈述T2.失败,因为,尽管列长度在65,535个字节的最大长度范围内,但需要两个额外的字节来记录长度,这导致行大小超过65,535字节:

    MySQL> Create Table T2(C1 Varchar(65535)不是NULL)Engine = InnoDB字符集Latin1;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs

    将列长度降低至65,533或更少允许该陈述成功。

    MySQL> Create Table T2(C1 Varchar(65533)不是空值)Engine = InnoDB字符集Latin1;查询OK,影响0行(0.01秒)
  • 为了myisam.桌子,空值列需要行中的额外空间来记录它们的值是否是空值。每个空值列需要额外的一点,舍入到最接近的字节。

    创建表的陈述T3.失败,因为myisam.需要空间空值除了可变长度列长度字节所需的空间之外的列,导致行大小超过65,535字节:

    MySQL>创建表T3(C1 VARCHAR(32765)NULL,C2 VARCHAR(32766)NULL)引擎= MYISAM字符集LATIN1;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs

    有关的信息Innodb.空值列存储,见innodb行格式

  • Innodb.限制行大小(在数据库页面内存储的数据)到4KB,8KB,16KB和32KB的数据库页面略小于半个数据库页面innodb_page_size.设置,64KB页面略低于16KB。

    创建表的陈述T4.失败,因为定义的列超过了16KB的行大小限制Innodb.页。

    MySQL> Create Table T4(C1 Char(255),C2 Char(255),C3 Char(255),C4 Char(255),C5 Char(255),C6 Char(255),C7 Char(255),C8 Char(255),C9焦炭(255),C10焦炭(255),C11焦炭(255),C12字符(255),C13焦炭(255),C14焦炭(255),C15炭(255),C16炭(255),C17焦炭(255),C18焦炭(255),C19焦炭(255),C20焦炭(255),C21焦炭(255),C22炭(255),C23焦炭(255),C24焦炭(255),C25 CHAR(255),C26 CHAR(255),C27 CHAR(255),C28 CHAR(255),C29 CHAR(255),C30 CHAR(255),C31 CHAR(255),C32 CHAR(255),C33炭(255))Engine = InnoDB Row_Format =动态默认字符集LATIN1;错误1118(42000):行尺寸太大(> 8126)。将某些列更改为文本或BLOB可能有所帮助。以当前的行格式,0字节的Blob前缀内联。