MySQL表列数和行大小限制详解

 更新时间:2024年04月26日 08:34:44   作者:黑风风  
MySQL在表的列数和行大小方面有一些限制,本文将对这些限制进行详细解释,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

MySQL表列数和行大小限制详解

MySQL在表的列数和行大小方面有一些限制,本文将对这些限制进行详细解释。

列数限制

MySQL对每个表的列数有硬限制为4096列,但对于给定的表,实际的最大列数可能会更少。确切的列限制取决于几个因素:

  1. 表的最大行大小限制了列的数量(和可能的大小),因为所有列的总长度不能超过这个大小。

  2. 单个列的存储要求限制了可以容纳在给定最大行大小内的列数。某些数据类型的存储要求取决于诸如存储引擎、存储格式和字符集等因素。

  3. 存储引擎可能会施加额外的限制,限制表列数。例如,InnoDB对每个表有1017列的限制。而MyISAM引擎则允许大约5000列。

  4. 功能键部分(参见CREATE INDEX语句)被实现为隐藏的虚拟生成存储列,因此表索引中的每个功能键部分都计入表的总列限制。

行大小限制

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

  1. MySQL表的内部表示具有最大行大小限制为65,535字节,即使存储引擎能够支持更大的行。BLOB和TEXT列只对行大小限制贡献9到12个字节,因为它们的内容是分开存储的。

  2. 对于InnoDB表,最大行大小适用于存储在数据库页内的数据,对于4KB、8KB、16KB和32KB的innodb_page_size设置,最大行大小略小于半个页面。例如,默认16KB的InnoDB页面大小的最大行大小略小于8KB。对于64KB页面,最大行大小略小于16KB。

  3. 如果包含可变长度列的行超过InnoDB最大行大小,则InnoDB会选择将可变长度列存储到外部页面,直到行符合InnoDB行大小限制。存储在外部的可变长度列的数据量因行格式而异。

  4. 不同的存储格式使用不同数量的页面头和尾数据,这影响可用于行的存储量。

举例说明

示例1:行大小超限

考虑以下尝试在MySQL中创建一个表的情况:

CREATE TABLE t (
  a VARCHAR(10000), b VARCHAR(10000),
  c VARCHAR(10000), d VARCHAR(10000),
  e VARCHAR(10000), f VARCHAR(10000),
  g VARCHAR(6000)
) ENGINE=InnoDB CHARACTER SET latin1;

此命令将因为行大小超过MySQL的最大限制而失败,报错信息如下:

ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs

示例2:改变列类型以适应行大小限制

将一些列改为TEXT类型,可以避免65,535字节行大小限制,因为BLOB和TEXT列的存储是分开的,每个只占用9到12字节。示例如下:

CREATE TABLE t (
  a VARCHAR(10000), b VARCHAR(10000),
  c VARCHAR(10000), d VARCHAR(10000),
  e VARCHAR(10000), f VARCHAR(10000),
  g TEXT(6000)
) ENGINE=MyISAM CHARACTER SET latin1;

此表创建成功,显示如何通过调整列类型来符合行大小限制。

示例3:存储可变长度数据的优化

对于InnoDB表,可变长度数据超过最大行大小时,InnoDB会将部分数据存储到外部页面。例如:

CREATE TABLE t (
  a VARCHAR(10000), b VARCHAR(10000),
  c VARCHAR(10000), d VARCHAR(10000),
  e VARCHAR(10000), f VARCHAR(10000),
  g TEXT(6000)
) ENGINE=InnoDB CHARACTER SET latin1;

由于TEXT列的外部存储,这个表创建也是成功的,表明InnoDB对可变长度列有特别的存储策略,可以有效利用空间。

示例4:列长和可存储数据的关系

创建包含最大长度VARCHAR列的表:

CREATE TABLE t2 (
  c1 VARCHAR(65533) NOT NULL
) ENGINE = InnoDB CHARACTER SET latin1;

当尝试创建包含VARCHAR(65535)的列时,会因为超出行大小而失败,因为VARCHAR需要额外的字节来存储长度信息。调整列长度至65533或更少,使得表创建成功。

示例5:CHAR列和行大小限制

尝试在InnoDB表中创建包含多个CHAR(255)列的表:

CREATE TABLE t4 (
  c1 CHAR(255), c2 CHAR(255), c3 CHAR(255),
  ... (多达33个CHAR(255)列) ...
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;

此尝试将失败,因为CHAR(255)列使得总行大小超过了16KB的InnoDB页限制。这个例子表明,即使单个CHAR(255)只占用255字节,多列的累积也可能导致总行大小超限。

到此这篇关于MySQL表列数和行大小限制详解的文章就介绍到这了,更多相关MySQL表列数和行大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql 5.6.24安装实例教程

    Mysql 5.6.24安装实例教程

    这篇文章主要介绍了Mysql 5.6.24安装实例教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • MySQL四种日志binlog/redolog/relaylog/undolog详解

    MySQL四种日志binlog/redolog/relaylog/undolog详解

    undo log主要存储的也是逻辑日志,比如我们要insert一条数据了,那undo log会记录的一条对应的delete日志,我们要update一条记录时,它会记录一条对应相反的update记录,这篇文章主要介绍了MySQL四种日志binlog/redolog/relaylog/undolog,需要的朋友可以参考下
    2024-08-08
  • 解析如何加快mysql编译的速度

    解析如何加快mysql编译的速度

    本篇文章是对如何加快mysql编译的速度进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL数据xtrabackup物理备份的方式

    MySQL数据xtrabackup物理备份的方式

    Xtrabackup是开源免费的支持MySQL 数据库热备份的软件,在 Xtrabackup 包中主要有 Xtrabackup 和 innobackupex 两个工具,本文给大家介绍MySQL数据xtrabackup物理备份方法,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • MYSQL常用命令与实用技巧

    MYSQL常用命令与实用技巧

    MYSQL常用命令与实用技巧...
    2007-07-07
  • 如何通过sql查找所有父节点和所有子节点(以mysql为例)

    如何通过sql查找所有父节点和所有子节点(以mysql为例)

    这篇文章主要给大家介绍了关于如何通过sql查找所有父节点和所有子节点,本文以mysql为例,项目中遇到一个需求,要求查处菜单节点的所有节点,这里给大家总结下,需要的朋友可以参考下
    2023-08-08
  • SQL实现LeetCode(181.员工挣得比经理多)

    SQL实现LeetCode(181.员工挣得比经理多)

    这篇文章主要介绍了SQL实现LeetCode(181.员工挣得比经理多),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MySQL 8.0.18给数据库添加用户和赋权问题

    MySQL 8.0.18给数据库添加用户和赋权问题

    这篇文章主要介绍了MySQL 8.0.18给数据库添加用户和赋权问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Mysql binlog的查看方法

    Mysql binlog的查看方法

    MySQL的二进制日志可以说是MySQL最重要的日志了,本文主要介绍了Mysql binlog的查看方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • MySQL按天分组统计一定时间内的数据实例(没有数据补0)

    MySQL按天分组统计一定时间内的数据实例(没有数据补0)

    我们在用Mysql制作数据可视化图表时候,经常需要按照天对数据进行分组统计,下面这篇文章主要给大家介绍了关于MySQL按天分组统计一定时间内的数据,没有数据补0的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论