MySQL表列数和行大小限制详解
MySQL在表的列数和行大小方面有一些限制,本文将对这些限制进行详细解释。
列数限制
MySQL对每个表的列数有硬限制为4096列,但对于给定的表,实际的最大列数可能会更少。确切的列限制取决于几个因素:
-
表的最大行大小限制了列的数量(和可能的大小),因为所有列的总长度不能超过这个大小。
-
单个列的存储要求限制了可以容纳在给定最大行大小内的列数。某些数据类型的存储要求取决于诸如存储引擎、存储格式和字符集等因素。
-
存储引擎可能会施加额外的限制,限制表列数。例如,InnoDB对每个表有1017列的限制。
-
功能键部分(参见CREATE INDEX语句)被实现为隐藏的虚拟生成存储列,因此表索引中的每个功能键部分都计入表的总列限制。
行大小限制
给定表的最大行大小由几个因素决定:
-
MySQL表的内部表示具有最大行大小限制为65,535字节,即使存储引擎能够支持更大的行。BLOB和TEXT列只对行大小限制贡献9到12个字节,因为它们的内容是分开存储的。
-
对于InnoDB表,最大行大小适用于存储在数据库页内的数据,对于4KB、8KB、16KB和32KB的innodb_page_size设置,最大行大小略小于半个页面。例如,默认16KB的InnoDB页面大小的最大行大小略小于8KB。对于64KB页面,最大行大小略小于16KB。
-
如果包含可变长度列的行超过InnoDB最大行大小,则InnoDB会选择将可变长度列存储到外部页面,直到行符合InnoDB行大小限制。存储在外部的可变长度列的数据量因行格式而异。
-
不同的存储格式使用不同数量的页面头和尾数据,这影响可用于行的存储量。