磁盘上表数据的存储需求取决于几个因素。不同的存储引擎表示不同的数据类型,并以不同的方式存储原始数据。表数据可能是针对列或整个行进行压缩的,这使得计算表或列的存储需求变得更加复杂。
尽管磁盘上的存储布局不同,但用于通信和交换表行信息的内部MySQL api使用了适用于所有存储引擎的一致数据结构。
本节包括MySQL支持的每种数据类型的存储需求的指导方针和信息,包括使用固定大小表示数据类型的存储引擎的内部格式和大小。信息按类别或存储引擎列出。
表的内部表示形式的最大行大小为65,535字节,即使存储引擎能够支持更大的行。这个数字不包括团
或文本
列,在此大小中仅贡献9到12个字节。为团
而且文本
数据、信息存储在内部与行缓冲区不同的内存区域中。根据处理相应类型的方法,不同的存储引擎以不同的方式处理该数据的分配和存储。有关更多信息,请参见第十六章,替代存储引擎,第8.4.7节“表列数和行大小的限制”.
NDB
表的使用4字节对齐;所有NDB
数据存储以4个字节的倍数进行。因此,一个通常需要15个字节的列值在NDB
表格例如,在NDB
表,非常小的整数
,短整型
,MEDIUMINT
,整数
(INT
)列类型由于对齐因素,每个记录需要4个字节的存储空间。
每一个位(
列需要米
)米
少量的存储空间。虽然一个人位
列是不4字节对齐,NDB
每一行保留4个字节(32位),用于所需的前1-32位位
列,然后是另外4个字节的位33-64,以此类推。
而一个零
它本身不需要任何存储空间,NDB
如果表定义中包含任何允许的列,则为每行保留4个字节零
,最多32个零
列。(如果定义的NDB Cluster表超过32零
最多64列零
列,则每行保留8个字节。)
的每个表NDB
存储引擎需要一个主键;如果您没有定义主键,则a”隐藏的”主键由NDB
.这个隐藏主键每条表记录消耗31-35字节。
您可以使用ndb_size.plPerl脚本进行评估NDB
存储需求。它连接到当前的MySQL(不是NDB Cluster)数据库,并创建一个报告,说明如果使用NDB
存储引擎。看到第23.4.28节," ndb_size.pl - NDBCLUSTER大小要求估计器"为更多的信息。
数据类型 | 存储要求 |
---|---|
非常小的整数 |
1个字节 |
短整型 |
2字节 |
MEDIUMINT |
3个字节 |
INT ,整数 |
4个字节 |
长整型数字 |
8个字节 |
浮动( |
如果0 <=则为4个字节p <= 24,如果25 <= 8字节p < = 53 |
浮动 |
4个字节 |
双(精度) ,真正的 |
8个字节 |
小数( ,数字( |
不同;看到下面的讨论 |
位( |
约(米 + 7) / 8个字节 |
值小数
(和数字
)列使用二进制格式表示,该格式将9位十进制(以10为基数)数字打包为4个字节。每个值的整数部分和小数部分的存储分别确定。每9位数字的倍数都需要4个字节,而”剩下的”数字需要四个字节的一部分。多余数字所需的存储空间如下表所示。
剩下的数字 | 的字节数 |
---|---|
0 | 0 |
1 | 1 |
2 | 1 |
3. | 2 |
4 | 2 |
5 | 3. |
6 | 3. |
7 | 4 |
8 | 4 |
为时间
,DATETIME
,时间戳
列,MySQL 5.6.4之前创建的表所需的存储与5.6.4之后创建的表不同。这是因为在5.6.4中进行了更改,允许这些类型具有小数部分,这需要从0到3个字节。
数据类型 | MySQL 5.6.4之前的存储要求 | 从MySQL 5.6.4开始需要存储 |
---|---|---|
一年 |
1个字节 | 1个字节 |
日期 |
3个字节 | 3个字节 |
时间 |
3个字节 | 3字节+小数秒存储 |
DATETIME |
8个字节 | 5字节+小数秒存储 |
时间戳 |
4个字节 | 4字节+小数秒存储 |
从MySQL 5.6.4开始,存储为一年
而且日期
保持不变。然而,时间
,DATETIME
,时间戳
以不同的方式表示。DATETIME
更有效地打包,对于非小数部分需要5个字节而不是8个字节,并且所有三个部分都有一个小数部分,需要从0到3个字节,这取决于存储值的小数秒精度。
精确到小数部分的秒 | 存储要求 |
---|---|
0 | 0字节 |
1、2 | 1个字节 |
3、4 | 2字节 |
5、6 | 3个字节 |
例如,时间(0)
,时间(2)
,(4)
,(6)
分别使用3、4、5和6字节。时间
而且时间(0)
是等价的,需要相同的存储空间。
有关临时值的内部表示的详细信息,请参见MySQL内部:重要算法和结构.
在下表中,米
表示声明的列长度(对于非二进制字符串类型,以字符为单位),对于二进制字符串类型,以字节为单位。l
表示给定字符串值的实际长度(以字节为单位)。
数据类型 | 存储要求 |
---|---|
CHAR ( |
InnoDB行格式的紧凑家族优化了可变长度字符集的存储。看到紧凑行格式存储特性.否则,米 ×w 字节,< = 255年,w 字符集中最大长度字符所需的字节数。 |
二进制( |
米 字节,0< = 255 |
VARCHAR ( ,VARBINARY ( |
l 如果列值需要0−255字节,则需要+ 1字节;l + 2字节,如果值可能需要超过255字节 |
TINYBLOB ,非常小的文本串 |
l + 1字节,其中l < 28 |
团 ,文本 |
l + 2字节,其中l < 216 |
MEDIUMBLOB ,简单 |
l + 3字节,其中l < 224 |
LONGBLOB ,量变 |
l + 4字节,其中l < 232 |
枚举(' |
1或2个字节,取决于枚举值的数量(最大值为65,535个值) |
设置(“ |
1、2、3、4或8字节,取决于set成员的数量(最多64个成员) |
可变长度字符串类型使用长度前缀加上数据存储。长度前缀根据数据类型的不同,需要1到4个字节,前缀的值为l
(字符串的字节长度)。例如,存储a简单
值要求l
字节用于存储值,加上三个字节用于存储值的长度。
计算用于存储特定对象的字节数字符
,VARCHAR
,或文本
列值时,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,当使用use utf8
Unicode字符集,您必须记住并非所有字符使用相同的字节数。utf8mb3
而且utf8mb4
字符集每个字符分别需要最多3和4个字节。用于不同类别的存储的细目utf8mb3
或utf8mb4
人物,看到第10.9节“Unicode支持”.
VARCHAR
,VARBINARY
,团
而且文本
类型是变长类型。对于每一个,存储需求取决于以下因素:
列值的实际长度
列的最大可能长度
用于列的字符集,因为有些字符集包含多字节字符
例如,一个VARCHAR (255)
列可以容纳一个最大长度为255个字符的字符串。假设列使用latin1
字符集(每个字符一个字节),实际需要的存储空间是字符串的长度(l
),加上一个字节来记录字符串的长度。的字符串“abcd”
,l
为4,存储需求为5字节。方法声明相同的列ucs2
双字节字符集,存储要求为10字节:的长度“abcd”
为8字节,列需要两个字节来存储长度,因为最大长度大于255(最多510字节)。
的有效最大数量字节可以存储在VARCHAR
或VARBINARY
列的最大行大小为65,535字节,在所有列之间共享。对于一个VARCHAR
列中存储多字节字符的有效最大数目字符是更少。例如,utf8mb4
每个字符最多需要4个字节,所以aVARCHAR
的列。utf8mb4
字符集最多可以声明为16,383个字符。看到第8.4.7节“表列数和行大小的限制”.
InnoDB
将长度大于或等于768字节的固定长度字段编码为可变长度字段,可在页外存储。例如,一个CHAR (255)
如果字符集的最大字节长度大于3,列可以超过768字节,就像与utf8mb4
.
的NDB
存储引擎支持变宽列。这意味着VARCHAR
NDB集群表中的列需要与任何其他存储引擎相同的存储量,唯一的例外是这些值是4字节对齐的。因此,该字符串“abcd”
存储在一个VARCHAR (50)
列使用latin1
字符集需要8个字节(而不是数组中的相同列值需要5个字节)MyISAM
表)。
文本
而且团
中的列的实现方式不同NDB
;的每一行文本
柱由两个独立的部分组成。其中一个是固定大小(256字节),实际上存储在原始表中。另一个由超过256字节的任何数据组成,这些数据存储在一个隐藏表中。第二个表中的行总是2000字节长。这意味着a的大小文本
列为256,如果大小
< = 256 (大小
表示行大小);否则,大小为256 +大小
+ (2000 × (大小
−256)% 2000)。
大小相当于一个枚举
对象由不同枚举值的数量确定。一个字节用于最多255个可能值的枚举。两个字节用于有256到65,535个可能值的枚举。看到第11.3.5节“ENUM类型”.
一个大小的集
对象由不同集合成员的数量确定。如果设置的大小是N
,对象占用(
字节,四舍五入到1、2、3、4或8个字节。一个N
+ 7) / 8集
最多支持64个成员。看到第11.3.6节“SET类型”.
MySQL使用4个字节存储几何值,表示SRID,后面是该值的WKB表示。的长度()
函数返回值存储所需的字节空间。
有关空间值的WKB和内部存储格式的描述,请参见第11.4.3节“受支持的空间数据格式”.
一般来说,储存要求为JSON
列与a大致相同LONGBLOB
或量变
列;也就是说,JSON文档所消耗的空间与存储在这些类型之一的列中的文档字符串表示所消耗的空间大致相同。但是,存储在JSON文档中的单个值的二进制编码(包括查找所需的元数据和字典)会造成一定的开销。例如,存储在JSON文档中的字符串需要4到10字节的额外存储空间,这取决于字符串的长度和存储它的对象或数组的大小。
此外,MySQL对存储在对象中的JSON文档的大小有限制JSON
的值,使其不能大于的值max_allowed_packet
.