【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页面的行大小限制,因此操作失败:

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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 桥接模式(实例详解)

文章目录 示例1:角色与装备系统示例2:UI控件库示例3:渲染引擎模块示例4:AI决策树算法示例5:物理模拟引擎 在Unity游戏开发中,桥接模式(Bridge Pattern)是一种设计模式,它…

扩散模型公式推导

这篇文章将尝试推导扩散模型 DDPM 中涉及公式,主要参考两个 B 站视频: 大白话AI狗中赤兔 本文所用 PPT 元素均来自 UP 主,狗中赤兔和大白兔AI,特此感谢。 在证明开始,我们需要先对扩散模型有一个整体的认知。扩散模型…

【心得】java从CC1链入门CC链个人笔记

来劲了,感觉离真正的CTF又近了一步。 本文仅从一个萌新的角度去谈,如有纰漏,纯属蒟蒻。 目录 CC链概念 CC链学习前置知识 CC1链 Version1 Version2 Version3 CC链概念 CC链 Commons Collections apache组织发布的开源库 里面主要对…

matlab appdesigner系列-常用19-超链接

超链接,可以执行的有2个,外部网页链接 和 外部matlab文件(.m文件) 示例:准备两个外部链接、文件 网页链接: https://www.mathworks.com/products/matlab.html matlab文件,Hyperlink.m msgb…

git bash右键菜单失效解决方法

git bash右键菜单失效解决方法 这几天重新更新了git,直接安装新版本后,右键菜单失效找不到了。找了好几个博客,发现都不全面,最后总结一下解决方法: (1)按winr,输入regedit打开注册…

安卓自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局: 我们只需要替换根布局所需的自动缩放,子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout(框架布局&#xff…

沃尔沃机器人的电动汽车部署战略

原创 | 文 BFT机器人 前言: 随着环保意识的提高和科技的进步,电动汽车在全球范围内正逐渐成为交通出行的主要方式。而在这个转变过程中,制造自动化的技术发展起到了关键的作用。目前,全球各大汽车制造商都在积极投入电动汽车的研…

操作系统-虚拟机(传统计算机 虚拟机 两类VMM对比 指令等级 特权与敏感)

文章目录 传统计算机虚拟机VMM的对比支持虚拟化的CPU通常分更多指令等级(特权 敏感) 传统计算机 传统物理机只有一个操作系统 两个进程在一个操作系统上运行会存在一些隐患(相互影响 争夺资源等) 解决方法:如果各个进…

[Linux]HTTP状态响应码列举

1xx:信息响应类,表示接收到请求并且继续处理 2xx:处理成功响应类,表示动作被成功接收、理解和接受 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理 4xx:客户端错误&#x…

Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据,并使用 Langchian 构建问答功能。 准备 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Ki…

HIVE中关联键类型不同导致数据重复,以及数据倾斜

比如左表关联键是string类型,右表关联键是bigint类型,关联后会出现多条的情况 解决方案: 关联键先统一转成string类型再进行关联 原因: 根据HIVE版本不同,数据位数上限不同, 低版本的超过16位会出现这种…

微信小程序底部按钮适配iPhoneX以上,显示遮挡问题

只需要在给底部按钮加个样式 /* 底部导航栏容器 */ .button-box {/* 使用 safe-area-inset-bottom 属性适配 iPhone X 及以上型号设备 */padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);/* 其他样式属性 */ }iPhone6/7/8效果 …

DNS解析是什么?DNS解析在网络通信中作用有哪些?

在网络通信过程中,DNS解析起着至关重要的作用,它负责将人们便于理解和记忆的域名翻译成计算机能够识别的IP地址,从而实现人们通过域名进行网络通信的目的。 DNS解析的原理 IP是互联网上每个计算机的标识符,计算机通过IP地址进行…

vue全局公共样式

vue公共样式代码存放在/src/styles文件夹里 index里引入其他组件公共样式,index.scss文件内容如下: import ./sidebar.scss; import ./searchForm.scss;body {height: 100%;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased;t…

hcip高级网络知识

一:计算机间信息传递原理 抽象语言----编码 编码---二进制 二进制---转换为电流(数字信号) 处理和传递数字信号 二:OSI--七层参考模型 ISO--1979 规定计算机系统互联的组织: OSI/RM ---- 开放式系统互联参考模型 --- 1…

L1-088 静静的推荐(Java)

天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的: 只考虑得分不低于 175 分的学生;一共接受 K 批次的推荐名单;同一批推荐名单上…

【模拟】力扣38(Java)

题目 class Solution {public String countAndSay(int n) {String ret "1";for(int i1;i<n;i)//解释n-1次ret{StringBuffer tmp new StringBuffer();int len ret.length();for(int left 0,right 0;right<len;){//双指针while(right < len &&…

力扣精选算法100道——x的平方根(二分查找专题)

x的平方根 首先看到这个题目的时候&#xff0c;我们需要对上一个二分查找专题的题目进行深度理解&#xff0c;然后了解模板&#xff0c;这题是完全利用的上一题的模板知识进行&#xff0c;如果直接看这个题目可能是有点懵的&#xff0c;因为我这里直接利用模板进行解题。力扣…

技术变革下的职业危机

在科技日新月异的时代&#xff0c;程序员这个曾经被认为是相对稳定的职业&#xff0c;也开始感受到前所未有的冲击。随着自动化和人工智能等技术的迅猛发展&#xff0c;裁员潮正在席卷整个编程行业&#xff0c;给程序员们敲响了职业危机的警钟。 一、裁员潮的根本原因 技术变革…

jetson NX读取RTSP视频流

一、项目原由 由于在项目中需要对光电吊舱进行调整,光电吊舱大部分都是使用RTSP流进行视频传输的,所以需要利用jetson 设备去读取视频流。 由于厂家拿过来的光电吊舱的IP地址是:IP地址为:192.168.abc.108 ip地址: 192.168.abc.108换句话就是他的推流RTSP为:RTSP://192.…