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

news/2024/5/18 22:39:47

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),... (多达33CHAR(255)) ...
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;

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

参考链接

  • MySQL官方文档:MySQL Documentation
  • 关于InnoDB行大小限制:Limits on Table Column Count and Row Size

在这里插入图片描述


http://www.mrgr.cn/p/78647321

相关文章

linux系统管理

1.用户、用户组 创建用户 useradd [-g -d] 用户名 选项:-g指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g 选项:-d指定用户HOME路径,不指定,HOME目录默认在:/home/用户名 删除用户 userdel [-r] 用户名 选项:-r,删…

Ubuntu22.04.4 - apt - 笔记

一、修改源配置 这里使用的时候又出现了联不通的情况,换成国内镜像 在update cp /etc/apt/source.list /etc/apt/source.list.bak vim source.list 换源地址 修改完(网上有,注意:根据Ubuntu版本不一样,部分内同也会不…

小型架构实验模拟

一 实验需求 二 实验环境 22 机器: 做nginx 反向代理 做静态资源服务器 装 nginx keepalived filebeat 44机器: 做22 机器的备胎 装nginx keepalived 99机器:做mysql的主 装mysqld 装node 装filebeat 77机器:做mysq…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码,查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

探索飞行奥秘:3D模型带你走进飞机涡轮发动机的世界

飞机涡轮发动机3D模型不仅是对真实发动机的精准复制,更是科技与艺术的完美结合。每一个细节都经过精心打磨,无论是复杂的叶片结构、精致的燃烧室,还是精密的控制系统,都让人叹为观止。仿佛置身于真实的发动机内部,感受着那股强大的力量从心底涌起。在浩瀚的蓝天下,飞机如…

C++高级特性:异常概念与处理机制(十四)

1、异常的基本概念 异常:是指在程序运行的过程中发生的一些异常事件(如:除数为0,数组下标越界,栈溢出,访问非法内存等) C的异常机制相比C语言的异常处理: 函数的返回值可以忽略&…

openwrt wifi连接做中继

连接目标wifi 重命名下 3. 4. 在无线安全里设置wifi密码后 保存应用 大功告成

JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 UDP 通信 1.1 DatagramSocket 类 1.2 DatagramPacket 类 1.3 实现 UDP 通信(一发一收) 1.3.1 客户端的开发 1.3.2 服务端的开发 1.4 实现 …

搭建MySQL主从结构时的问题

说明:记录搭建MySQL主从结构时遇到的几个问题; 问题一:连接主节点失败 搭建完成后从节点查看状态如下: 错误:error connecting to master admin主机IP - retry-time: 60 retries: 712 message: Host 主机IP is block…

2、MATLAB入门常用命令

一、退出和中断 exit和quit:结束MATLAB会话。程序完成,如果没有明确保存,则变量中的数据丢失。 Ctrl c:中断一个MATLAB任务。例如,当MATLAB正在计算或打印时,中断一个任务,但会话并没有结束。…

[题解] [NOIP2011 提高组] Mayan 游戏

[题解] [NOIP2011 提高组] Mayan 游戏 题目描述 有一个 \(7\) 行 \(5\) 列的格子棋盘,有的格子上有方块。方块有重力,即如果一个方块下面没有其他方块,他就会往下掉,直到触底或者下面有方块为止。 每个方块都有自己的颜色,如果连着三个竖着或者横着的方块颜色相同,它们就…

敏捷产品经理实训 / 敏捷产品负责人实训

​ 课程简介 优秀的产品通常包括以下三个特征: 第一:能够抓住用户痛点,帮助用户解决问题;第二:容易使用,极致的用户体验;第三:质量好、性能稳定。 这是一个两天的面向产品经理的实训课程,课程旨在帮助学员掌握按照敏捷和互联网思维进行产品研发,打造用户喜爱的产品的…

C语言编程题_3D接雨水

接雨水的题目描述如下。 (1) 2D接雨水: 字节员工是不是个个都会接雨水 ; (2) 3D接雨水: 407. 接雨水 II ; (3) 3D接雨水: 字节人都会的 3D接雨水 。 问题描述 难度:困难 给你一个 m x n 的矩阵&#xff…

JMeter定时器(一)

一 前言 环境: window 10 JMeter 5.3 二 定时器 定时器(Timers)的作用就是对取样器(sampler)的执行进行延迟,所以,定时器只对同作用域的取样器有意义 定时器会在其所处作用域内的取样器之前执行。把定时器添加为取样器的子节点,这样就会在取样器之前执行 1 固定定时器…

SpringCloud-AMQP

【BV1LQ4y127n4】SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。 SpringAmqp官方地址:https://spring.io/projects/spring-amqpSpringAMQP提供了三个功能:自动声明队列、交换机及其绑定关系 基于注解的监听器模式,异…

Pandas read_csv 参数详解

前言 在使用 Pandas 进行数据分析和处理时,read_csv 是一个非常常用的函数,用于从 CSV 文件中读取数据并将其转换成 DataFrame 对象。read_csv 函数具有多个参数,可以根据不同的需求进行灵活的配置。本文将详细介绍 read_csv 函数的各个参数及其用法,帮助大家更好地理解和利…

倒计时开始!Big Demo Day第十二期,揭秘DePIN,探索Web3未来(附参会指南)

香港—— 全球领先的 Web3.0 活动 Big Demo Day 第十二期即将于 4 月 26 日在香港数码港盛大举行。本次活动由知名科技企业 ZeeprLabs 赞助,Central Research 主办,并得到 Techub News 的联合主办以及数码港、852Web3 等机构的合作支持。 在过去的 11 期…

【Hadoop】-HDFS的Shell操作[3]

目录 前言 一、HDFS集群启停命令 1.一键启停脚本可用 2.独立进程启停可用 二、文件系统操作命令 1、创建文件夹 2、查看指定目录下内容 3、上传文件到HDFS指定目录下 4、查看HDFS文件内容 5、下载HDFS文件 6、拷贝HDFS文件 7、追加数据到HDFS文件中 8、HDFS数据移…

(数据科学学习手札160)使用miniforge代替miniconda

本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1 简介大家好我是费老师,conda作为Python数据科学领域的常用软件,是对Python环境及相关依赖进行管理的经典工具,通常集成在anaconda或miniconda等产品中供用户日常使用。但长久以来,conda在很…