MySQL 表列数和行大小有哪些限制?
列数限制
MySQL 对每个表有 4096 列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:
表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过该大小
个列的存储要求限制了给定最大行大小内的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素
存储引擎可能会施加其他限制表列计数的限制。例如,
InnoDB
每个表的限制为 1017 列功能键部分被实现为隐藏的虚拟生成的存储列,因此表索引中的每个功能键部分都计入表的总列数限制。
行大小限制
给定表的最大行大小由几个因素决定:
MySQL 表的内部表示具有 65,535 字节的最大行大小限制,即使存储引擎能够支持更大的行也是如此。
BLOB
和TEXT
列仅有助于朝向行大小限制 9〜12 字节,因为它们的内容是从该行的其余部分分开存储。InnoDB
对于 4KB,8KB,16KB 和 32KBinnodb_page_size
设置,表 的最大行大小(适用于本地存储在数据库页面内的数据)略小于页面的一半 。例如,对于默认的 16KBInnoDB
页面大小,最大行大小略小于 8KB 。对于 64KB 页面,最大行大小略小于 16KB如果包含 可变长度列的
InnoDB
行超出最大行大小,请InnoDB
选择可变长度列进行外部页外存储,直到该行适合InnoDB
行大小限制。对于行外存储的变长列,本地存储的数据量因行格式而异。不同的存储格式使用不同数量的页面标题和尾部数据,这会影响行可用的存储量(这里不做展开,感兴趣的可以查阅官网了解详情)
行大小限制案例
在下面的 MyISAM 例子中,改变柱 TEXT 避免了 65535 字节的行大小限制,并且允许成功,因为操作 BLOB 和 TEXT 列仅有助于朝向行大小 9 至 12 个字节。
操作成功执行 InnoDB 表,因为更改列以 TEXT 避免 MySQL 65,535 字节行大小限制,并且 InnoDB 可变长度列的页外存储避免了 InnoDB 行大小限制。
可变长度列的存储包括长度字节,它们被计入行大小。例如, VARCHAR(255) CHARACTER SET utf8mb3 列需要两个字节来存储值的长度,因此每个值最多可以占用 767 个字节。
t1 由于列需要 32,765 + 2 个字节和 32,766 + 2 个字节,因此 创建表的语句成功,最大行大小为 65,535 字节:
将列长度减少到 65,533 或更少可允许语句成功。
对于 MyISAM 表, NULL 列需要行中的额外空间才能记录其值 NULL。每 NULL 列需要一位额外的值,向上舍入到最接近的字节。
创建表的语句 t3 失败,因为除了可变长度列长度字节所需的空间之外,还 MyISAM 需要 NULL 列的空间,导致行大小超过 65,535 字节:
InnoDB 将行大小(对于数据库页面中本地存储的数据)限制为略小于 4KB,8KB,16KB 和 32KB innodb_page_size 设置的数据库页面的一半,对于 64KB 页面,将行大小限制 为略小于 16KB。
t4 由于定义的列超过 16KB InnoDB 页面的行大小限制,因此 创建表的语句失败。
原文地址:MySQL 表列数和行大小有哪些限制?
版权声明: 本文为 InfoQ 作者【码农架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/b99a5528171ebb0329fb58df5】。文章转载请联系作者。
评论