MySQL表列数和行大小限制详解
创作时间:
作者:
@小白创作中心
MySQL表列数和行大小限制详解
引用
CSDN
1.
https://blog.csdn.net/kaka_buka/article/details/138190797
在数据库设计中,了解MySQL表的列数和行大小限制至关重要。本文将详细解析这些限制,并通过具体示例说明如何在遇到限制时进行调整。
MySQL表列数和行大小限制详解
MySQL在表的列数和行大小方面有一些限制,本文将对这些限制进行详细解释。
列数限制
MySQL对每个表的列数有硬限制为4096列,但对于给定的表,实际的最大列数可能会更少。确切的列限制取决于几个因素:
- 表的最大行大小限制了列的数量(和可能的大小),因为所有列的总长度不能超过这个大小。
- 单个列的存储要求限制了可以容纳在给定最大行大小内的列数。某些数据类型的存储要求取决于诸如存储引擎、存储格式和字符集等因素。
- 存储引擎可能会施加额外的限制,限制表列数。例如,InnoDB对每个表有1017列的限制。而MyISAM引擎则允许大约5000列。
- 功能键部分(参见CREATE INDEX语句)被实现为隐藏的虚拟生成存储列,因此表索引中的每个功能键部分都计入表的总列限制。
行大小限制
给定表的最大行大小由几个因素决定:
- MySQL表的内部表示具有最大行大小限制为65,535字节,即使存储引擎能够支持更大的行。BLOB和TEXT列只对行大小限制贡献9到12个字节,因为它们的内容是分开存储的。
- 对于InnoDB表,最大行大小适用于存储在数据库页内的数据,对于4KB、8KB、16KB和32KB的innodb_page_size设置,最大行大小略小于半个页面。例如,默认16KB的InnoDB页面大小的最大行大小略小于8KB。对于64KB页面,最大行大小略小于16KB。
- 如果包含可变长度列的行超过InnoDB最大行大小,则InnoDB会选择将可变长度列存储到外部页面,直到行符合InnoDB行大小限制。存储在外部的可变长度列的数据量因行格式而异。
- 不同的存储格式使用不同数量的页面头和尾数据,这影响可用于行的存储量。
举例说明
示例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 Documentation
- 关于InnoDB行大小限制:Limits on Table Column Count and Row Size
热门推荐
春季西服的N种搭配,甜酷风格随意切换,太实用了!
滴水观音什么时候换盆最好
盆栽怎么换盆 盆栽换盆注意事项
宝莲灯鱼的饲养4个常识,看了不吃亏
宝莲灯鱼的饲养指南:水质调节与群居性管理
如何合理分配企业利润以实现可持续发展?这种利润分配方式有哪些影响因素?
轰趴馆装修效果图设计:打造个性化与功能性并重的聚会空间
医美需要什么资质
哪个考勤系统比较好用?
马来西亚买车记—全网最详细攻略
吃什么药能控制大脑不胡思乱想
佛山地铁三号线在建段开通运营,八大科技创新助力!
胎儿何时开始对外界刺激做出反应?
eSIM如何开通?详细步骤和常见问题解答?
R语言ARMA-GARCH模型金融产品价格实证分析黄金价格时间序列|附代码数据
“狠人”犯罪心理分析及法律应对策略
清华简:破译千年竹简 求索文明密码
杜勇:清华简与夏史重建
塔罗牌五张牌阵怎么排?
哑铃减肚子上肉最有效的运动
寒食节和清明节有什么区别?寒食节和清明节是什么关系?
寒食节跟清明节区别(寒食节和清明节有何区别)
曹操为什么杀吕伯奢全家,有三种说法
曹操错杀吕伯奢——一段历史的悲剧与反思
揭秘日本"神待少女":期待神灵降临与残酷现实交织
梦见毒蜂:从心理学到周公解梦的多重解读
AE插件使用指南:从安装到实战应用
CS:GO历届Major赛事回顾:从简陋展会到全球顶级电竞盛宴
使用args和 kwargs 实现函数的灵活参数传递
“大脑U盘”“智能皮肤”来了,脑机接口有了新突破