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

这篇具有很好参考价值的文章主要介绍了【MySQL】表列数和行大小限制详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

限制维度

列数量限制

表的最大行大小

单个列的存储要求

存储引擎的附加限制

功能键部分

行容量限制

MySQL表的内部实现

InnoDB表的最大行大小

超出InnoDB最大行大小的处理

不同存储格式的影响

限制示例

行大小限制示例

InnoDB下

MyISAM下

InnoDB变长情况示例

MyISAM变长情况示例

行大小限制示例


MySQL是一种常用的关系型数据库管理系统,广泛用于Web应用程序的开发和数据存储。在使用MySQL的过程中,了解表格列数和行大小的限制是至关重要的,因为它们直接影响到数据库的设计和性能。本文将深入探讨MySQL中列数和单个行大小的限制。

限制维度

列数量限制

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

表的最大行大小

表的最大行大小限制了列数(可能还包括列的大小),因为所有列的总长度不能超过这个大小。有关更多信息,请参阅行大小限制。

单个列的存储要求

单个列的存储要求会限制适应给定最大行大小的列数。不同数据类型的存储要求取决于存储引擎、存储格式和字符集等因素。

存储引擎的附加限制

存储引擎可能会施加额外的限制,进一步限制表的列数。例如,InnoDB对每个表有一个1017列的限制。

功能键部分

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

行容量限制

给定表的行容量大小由多个因素决定

MySQL表的内部实现

MySQL表的内部实现对行的最大大小设定了一个限制,即使存储引擎能够支持更大的行。BLOB和TEXT列仅对行大小限制贡献了9到12字节,因为它们的内容存储在行的其余部分之外。

InnoDB表的最大行大小

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

超出InnoDB最大行大小的处理

如果包含变长列的行超过了InnoDB最大行大小,InnoDB会选择将变长列存储在页面外,直到行适应InnoDB行大小限制。存储在本地的存储在页面外的可变长度列的数据量因行格式而异。

不同存储格式的影响

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

  • InnoDB行格式
  • MyISAM存储格式

限制示例

行大小限制示例

MySQL的最大行大小限制为65,535字节,以下是对InnoDB和MyISAM示例的演示。尽管存储引擎可能支持更大的行,但这个限制是强制执行的,与存储引擎无关。

InnoDB下

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;
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

在InnoDB表中,将列更改为TEXT成功进行的原因是,这样的变更避免了MySQL的65,535字节行大小限制,并且InnoDB对可变长度列的页外存储也规避了InnoDB行大小限制。

mysql> 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;
Query OK, 0 rows affected (0.02 sec)

MyISAM下

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=MyISAM CHARACTER SET latin1;
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

在以下的MyISAM示例中,将列更改为TEXT可以避免65,535字节的行大小限制,并且允许操作成功进行,因为BLOB和TEXT列仅对行大小贡献了9到12字节。

mysql> 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;
Query OK, 0 rows affected (0.02 sec)

InnoDB变长情况示例

可变长度列的存储包括长度字节,这些字节计入行大小。例如,一个VARCHAR(255) CHARACTER SET utf8mb3列占用两个字节来存储值的长度,因此每个值最多可以占用767字节。

以下是创建表t1的语句,成功的原因是这些列需要32,765 + 2字节和32,766 + 2字节,总大小在65,535字节的最大行大小范围内:

mysql> CREATE TABLE t1
       (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)

创建表t2的语句失败,尽管列的长度在65,535字节的最大长度范围内,但仍需要额外的两个字节来记录长度,导致行大小超过了65,535字节:

mysql> CREATE TABLE t2
       (c1 VARCHAR(65535) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
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

减小列的长度至65,533或更低可以使创建表的操作成功。例如:

mysql> CREATE TABLE t2
       (c1 VARCHAR(65533) NOT NULL)
       ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.01 sec)

MyISAM变长情况示例

对于MyISAM表,NULL列需要额外的空间来记录它们的值是否为NULL。每个NULL列需要额外的一位,四舍五入到最近的字节。

创建表t3的语句失败,因为MyISAM除了需要为可变长度列的长度字节分配空间外,还需要为NULL列分配空间,导致行大小超过了65,535字节:

mysql> CREATE TABLE t3
       (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
       ENGINE = MyISAM CHARACTER SET latin1;
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

行大小限制示例

InnoDB限制行大小(对于存储在数据库页面内的本地数据)略小于4KB、8KB、16KB和32KB的innodb_page_size设置的一半,并且略小于64KB页面的16KB。

以下是创建表t4的语句,由于定义的列超过了16KB InnoDB页面的行大小限制,因此操作失败:文章来源地址https://www.toymoban.com/news/detail-821759.html

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 CHAR(255),
       c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),
       c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),
       c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),
       c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),
       c22 CHAR(255),c23 CHAR(255),c24 CHAR(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 CHAR(255)
       ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.
In current row format, BLOB prefix of 0 bytes is stored inline.

到了这里,关于【MySQL】表列数和行大小限制详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解各版本Web服务器限制请求体大小的方法

    我们在上传大文件的时候通常会把请求体大小限制设置的很大,但平常没有这种业务需求的时候一般就会做出限制,避免异常请求的进入,我们该怎么去设置这个限制呢? 一般来说,Linux服务器没有直接限制请求参数包大小的限制。但是,通常会设置一些配置来限制请求大小

    2024年02月08日
    浏览(37)
  • MySQL 全局锁、表锁和行锁

    1、全局锁 全局锁,是指对整个MySQL数据库加锁,对应的命令是flush tables with read lock;(以下简称FTWRL) 当你需要让整个库处于只读模式的时候,可以使用这个语法,它的应用场景,一般是在 全库逻辑备份的时候 。我们知道MySQL自带的mysqldump逻辑备份工具可以使用--single-tran

    2024年02月08日
    浏览(37)
  • 在MySQL中查看数据库和表的数据大小

    在管理和维护MySQL数据库时,了解数据库和表的数据大小是非常重要的。这可以帮助您监控数据库的增长、优化性能以及规划存储需求。本博客将介绍如何使用SQL查询来查看MySQL数据库和表的数据大小。 首先,我们将学习如何查看整个MySQL数据库的总数据大小,包括所有数据库

    2024年02月09日
    浏览(71)
  • mysql语句查看数据库表所占容量空间大小

         六. 查看所有产生碎片的表 查看某个表的碎片大小 SHOW TABLE STATUS LIKE \\\'表名\\\'; 查询结果中的\\\'Data_free\\\'字段的值就是碎片大小。 7. 清理表碎片

    2024年02月11日
    浏览(41)
  • Mysql 查询数据库或数据表中的数据量以及数据大小

     许多数据库的元数据都是存储在mysql中的,例如hive、startrockes,因此可以通过mysql中的“information_schema.TABLES”表来查询对应数据库或对应数据表的具体信息。 1、查询各个数据库中的数据条数和数据大小 2、查询各个数据表中的数据条数和数据大小 3、查看指定数据库容量大小

    2024年04月27日
    浏览(53)
  • MySQL查询数据库、表以及表行数所占内存大小

    在开发中我们想知道某个数据库,或者某个数据表的内存大小,那么怎么查询呢?下面通过简单示例一一介绍,希望对您有所帮助。

    2024年02月16日
    浏览(59)
  • Sql Server中查询数据库所有表及其数据总条数和占用空间

    1、查询某数据库中的所有数据表 SELECT name 数据表 FROM sysobjects WHERE xtype=\\\'u\\\' ORDER BY name 2、查询某数据库中的所有数据表及其数据总条数 SELECT a.name 数据表, b.rows 数据总条数 FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE ( a.type = \\\'u\\\' ) AND ( b.indid IN ( 0, 1 ) ) ORDER BY a.name,b.row

    2024年02月02日
    浏览(44)
  • input限制只能输入数字,限制输入数字长度或者大小

    1.限制只能输入数字 方式一 :此方式只能控制输入的内容是数字,不能控制是否是正负数 方式二 :此方式可控制输入的内容是数字 了解一下 js replace : 拓展 1.限制输入的数字长4位 了解一下 js slice : 2.限制输入的数字最大值为10 3.限制输入的数字最小值为0 4.限制长度,大小

    2024年02月11日
    浏览(66)
  • nginx上传文件大小限制

    nginx默认的上传文件大小是有限制的,一般为2MB,如果你要上传的文件超出了这个值,将可能上传失败。 如果要修改这个大小限制,只需要打开nginx.conf文件。 找到\\\"client_max_body_size”,如果没有的话,在http部分加上它。设置你想要修改的大小,例如: 然后重启Nginx使配置生效

    2024年02月11日
    浏览(53)
  • 前端文件上传,文件大小限制

            在项目中存在多个地方需要上传文件到服务器,如果不对文件的大小进行限制,就会发送不可预知的异常,严重的情况下会耗尽服务器资源导致宕机,所以对文件的大小进行限制是必要的。         限制文件大小,可以再后端处理,也可以再容器的配置上处理,

    2024年01月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包