10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

MySQL 8.0参考手册/数据类型/数据类型存储要求

11.7数据类型存储要求

磁盘上表数据的存储需求取决于几个因素。不同的存储引擎表示不同的数据类型,并以不同的方式存储原始数据。表数据可能是针对列或整个行进行压缩的,这使得计算表或列的存储需求变得更加复杂。

尽管磁盘上的存储布局不同,但用于通信和交换表行信息的内部MySQL api使用了适用于所有存储引擎的一致数据结构。

本节包括MySQL支持的每种数据类型的存储需求的指导方针和信息,包括使用固定大小表示数据类型的存储引擎的内部格式和大小。信息按类别或存储引擎列出。

表的内部表示形式的最大行大小为65,535字节,即使存储引擎能够支持更大的行。这个数字不包括文本列,在此大小中仅贡献9到12个字节。为而且文本数据、信息存储在内部与行缓冲区不同的内存区域中。根据处理相应类型的方法,不同的存储引擎以不同的方式处理该数据的分配和存储。有关更多信息,请参见第十六章,替代存储引擎,第8.4.7节“表列数和行大小的限制”

InnoDB表存储要求

看到第15.10节,“InnoDB行格式”有关存储要求的信息InnoDB表。

NDB表存储要求

重要的

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个字节
浮动(p 如果0 <=则为4个字节p<= 24,如果25 <= 8字节p< = 53
浮动 4个字节
双(精度)真正的 8个字节
小数(D数字(D 不同;看到下面的讨论
位( 约(+ 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
枚举('value1”、“value2”,……) 1或2个字节,取决于枚举值的数量(最大值为65,535个值)
设置(“value1”、“value2”,……) 1、2、3、4或8字节,取决于set成员的数量(最多64个成员)

可变长度字符串类型使用长度前缀加上数据存储。长度前缀根据数据类型的不同,需要1到4个字节,前缀的值为l(字符串的字节长度)。例如,存储a简单值要求l字节用于存储值,加上三个字节用于存储值的长度。

计算用于存储特定对象的字节数字符VARCHAR,或文本列值时,必须考虑用于该列的字符集以及该值是否包含多字节字符。特别是,当使用use utf8Unicode字符集,您必须记住并非所有字符使用相同的字节数。utf8mb3而且utf8mb4字符集每个字符分别需要最多3和4个字节。用于不同类别的存储的细目utf8mb3utf8mb4人物,看到第10.9节“Unicode支持”

VARCHARVARBINARY,而且文本类型是变长类型。对于每一个,存储需求取决于以下因素:

  • 列值的实际长度

  • 列的最大可能长度

  • 用于列的字符集,因为有些字符集包含多字节字符

例如,一个VARCHAR (255)列可以容纳一个最大长度为255个字符的字符串。假设列使用latin1字符集(每个字符一个字节),实际需要的存储空间是字符串的长度(l),加上一个字节来记录字符串的长度。的字符串“abcd”l为4,存储需求为5字节。方法声明相同的列ucs2双字节字符集,存储要求为10字节:的长度“abcd”为8字节,列需要两个字节来存储长度,因为最大长度大于255(最多510字节)。

的有效最大数量字节可以存储在VARCHARVARBINARY列的最大行大小为65,535字节,在所有列之间共享。对于一个VARCHAR列中存储多字节字符的有效最大数目字符是更少。例如,utf8mb4每个字符最多需要4个字节,所以aVARCHAR的列。utf8mb4字符集最多可以声明为16,383个字符。看到第8.4.7节“表列数和行大小的限制”

InnoDB将长度大于或等于768字节的固定长度字段编码为可变长度字段,可在页外存储。例如,一个CHAR (255)如果字符集的最大字节长度大于3,列可以超过768字节,就像与utf8mb4

NDB存储引擎支持变宽列。这意味着VARCHARNDB集群表中的列需要与任何其他存储引擎相同的存储量,唯一的例外是这些值是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,对象占用N+ 7) / 8字节,四舍五入到1、2、3、4或8个字节。一个最多支持64个成员。看到第11.3.6节“SET类型”

空间类型存储要求

MySQL使用4个字节存储几何值,表示SRID,后面是该值的WKB表示。的长度()函数返回值存储所需的字节空间。

有关空间值的WKB和内部存储格式的描述,请参见第11.4.3节“受支持的空间数据格式”

JSON存储需求

一般来说,储存要求为JSON列与a大致相同LONGBLOB量变列;也就是说,JSON文档所消耗的空间与存储在这些类型之一的列中的文档字符串表示所消耗的空间大致相同。但是,存储在JSON文档中的单个值的二进制编码(包括查找所需的元数据和字典)会造成一定的开销。例如,存储在JSON文档中的字符串需要4到10字节的额外存储空间,这取决于字符串的长度和存储它的对象或数组的大小。

此外,MySQL对存储在对象中的JSON文档的大小有限制JSON的值,使其不能大于的值max_allowed_packet