在磁盘上存储表数据的要求取决于几个因素。不同的存储引擎表示数据类型,并以不同的方式存储原始数据。表数据可能被压缩,要么是针对一列,要么是针对整行,这会使计算表或列的存储需求变得复杂。
尽管磁盘上的存储布局不同,内部的MySQL api通信和交换关于表行的信息使用一致的数据结构,适用于所有存储引擎。
本节包括MySQL支持的每个数据类型的存储要求的指南和信息,包括使用固定大小表示数据类型的存储引擎的内部格式和大小。信息由类别或存储引擎列出。
表的内部表示的最大行大小为65,535字节,即使存储引擎能够支持更大的行。这个数字不包括团
或者文本
列,朝向此尺寸仅提供9到12个字节。为团
和文本
数据、信息内部存储在与行缓冲区不同的内存区域中。不同的存储引擎根据它们处理相应类型的方法,以不同的方式处理该数据的分配和存储。有关更多信息,请参见第15章,替代存储引擎, 和第8.4.7节“桌柱数量和行大小的限制”。
NDB
表使用4字节对齐;所有NDB
数据存储以4个字节的倍数完成。因此,通常需要15个字节的列值在NDB
桌子。例如,在NDB
表,非常小的整数
,短整型
,MEDIUMINT
, 和整数
(INT
)列类型每个记录每个记录都需要4个字节存储,由于对准因子。
每个位(
柱子需要米
)米
存储空间位。虽然个人位
列是不是4字节对齐,NDB
为所需的前1-32位保留每行4字节(32位)位
列,然后是BITS 33-64的另一个4个字节,等等。
虽然A.空值
本身不需要任何存储空间,NDB
如果表定义包含定义的列,则每行保留4个字节空值
,多达32空值
列。(如果一个NDB Cluster表定义了超过32空值
列最多64个空值
列,然后每行保留8个字节。)
每个桌子使用NDB
存储引擎需要一个主键;如果没有定义主键,则”隐”主键由NDB
。这个隐藏的主键每个表记录消耗31-35个字节。
你可以使用ndb_size.pl用于估计的Perl脚本NDB
存储需求。它连接到当前的MySQL(不是NDB Cluster)数据库,并创建一个报告,说明如果使用NDB
存储引擎。看到第21.4.29节,“ndb_size.pl - NDBCLUSTER大小需求评估器”为更多的信息。
数据类型 | 存储要求 |
---|---|
非常小的整数 |
1个字节 |
短整型 |
2字节 |
MEDIUMINT |
3个字节 |
INT ,整数 |
4个字节 |
big |
8个字节 |
漂浮( |
4字节如果0 <=p <= 24,如果25 <= 8字节p < = 53 |
漂浮 |
4个字节 |
双(精度) ,真实的 |
8个字节 |
小数( ,数字( |
不同;看到下面的讨论 |
位( |
约(米 + 7) / 8个字节 |
价值十进制
(和数字
)使用二进制格式表示列,该格式将九个十进制(基本10)数字包装为四个字节。为每个值的整数和分数部分的存储分别确定。九位数的每个倍数需要四个字节,而且”剩下的”数字需要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前需要存储 | 从MySQL 5.6.4开始需要存储 |
---|---|---|
一年 |
1个字节 | 1个字节 |
日期 |
3个字节 | 3个字节 |
时间 |
3个字节 | 3字节+分数秒存储 |
DATETIME |
8个字节 | 5字节+分数秒存储 |
时间戳 |
4个字节 | 4字节+分数秒存储 |
as 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 + 1字节如果列值需要0−255字节,l + 2字节,如果值可能需要超过255字节 |
TINYBLOB ,TinyText. |
l + 1个字节,在哪里l < 28 |
团 ,文本 |
l + 2字节,其中l < 216. |
MEDIUMBLOB ,简单 |
l + 3字节,其中l < 224. |
LONGBLOB ,longtext. |
l + 4字节,其中l < 232. |
枚举(' |
1或2字节,取决于枚举值的数量(最多65,535个值) |
设置(“ |
1、2、3、4或8字节,取决于集合成员的数量(最多64个成员) |
使用长度前缀加数据存储可变长度字符串类型。长度前缀根据数据类型需要一到四个字节,并且前缀的值是l
(字符串的字节长度)。例如,存储一个简单
值要求l
存储值的字节加上存储值的长度的三个字节。
计算用于存储特定的字节数字符
,varchar.
, 或者文本
列值,您必须考虑该列用于该列的字符集以及值是否包含多字节字符。特别是,使用时use utf8
Unicode字符集,您必须记住,并非所有字符都使用相同数量的字节。utf8mb3
和utf8mb4
字符集可以分别要求每个字符最多三个字节和四个字节。为不同的存储所使用的分类utf8mb3
或者utf8mb4
人物,看到章节10.9,“Unicode支持”。
varchar.
,VARBINARY
,团
和文本
类型是变长类型。对于每一种,存储要求取决于以下因素:
列值的实际长度
列的最大可能长度
用于列的字符集,因为有些字符集包含多字节字符
例如,一个varchar(255)
列可以包含最大长度为255个字符的字符串。假设该列使用latin1
字符集(每个字符一个字节),实际需要的存储是字符串的长度(l
),加上一个字节来记录字符串的长度。对于字符串“abcd”
,l
是4,存储要求是五个字节。如果换算使用相同的列以使用ucs2
双字节字符集,存储要求为10字节:长度“abcd”
是8个字节,列需要两个字节来存储长度,因为最大长度大于255(最多510字节)。
的有效最大数目字节可以存储在varchar.
或者VARBINARY
列受到65,535个字节的最大行大小,在所有列之间共享。为一个varchar.
列,存储多字节字符的有效最大数目字符少。例如,utf8mb3
每个字符最多需要三个字节,因此varchar.
使用utf8mb3
字符集可以声明为最多21,844个字符。看到第8.4.7节“桌柱数量和行大小的限制”。
Innodb.
编码大于或等于768字节的固定长度字段,其长度为可变长度字段,可以在页面上存储。例如,一个CHAR (255)
如果字符集的最大字节长度大于3,列可以超过768个字节,就像与utf8mb4
。
的NDB
存储引擎支持变宽列。这意味着varchar.
NDB Cluster表中的列需要与任何其他存储引擎相同的存储量,除了这些值是4字节对齐的。因此,该字符串“abcd”
存储在A.瓦尔(50)
列使用latin1
字符集需要8个字节(而不是5个字节的相同的列值在一个MyISAM
桌子)。
文本
和团
列在不同的情况下实现NDB
存储引擎,其中a文本
柱是由两个独立的部分组成。其中一个是固定大小(256字节),实际上存储在原始表中。另一个由超过256字节的数据组成,这些数据存储在一个隐藏表中。第二个表中的行总是2000字节长。这意味着a的大小文本
列为256,如果大小
< = 256 (大小
表示行大小);否则,大小为256 +大小
+ (2000 × (大小
- 256)%2000)。
大小为枚举
对象由不同枚举值的数量确定。一个字节用于最多255个可能值的枚举。两个字节用于具有256到65,535个可能值的枚举。看到第11.3.5节“枚举类型”。
a的大小集
对象由不同集合成员的数量决定。如果设置大小为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
或者longtext.
列;也就是说,JSON文档所消耗的空间与存储在这些类型之一的列中的文档字符串表示所消耗的空间大致相同。但是,二进制编码(包括查找所需的元数据和字典)会增加JSON文档中存储的单个值的开销。例如,存储在JSON文档中的字符串需要4到10个字节的额外存储,这取决于字符串的长度和存储它的对象或数组的大小。
此外,MySQL对存储在A中的任何JSON文档的大小限制JSON
列,使其不能大于的值max_allowed_packet
。