mysql json 中日期_mysql8 参考手册--NDB表、数值、日期和时间、字符串、JSON存储要求...

NDB表存储要求

重要

NDB表使用 4字节对齐 ; 所有NDB数据存储均以 4字节的倍数完成。因此,通常需要15个字节的列值在NDB表中需要16个字节 。例如,在 NDB表中, TINYINT, SMALLINT, MEDIUMINT,和 INTEGER (INT)列类型均需要每记录4个字节存储由于取向因子。

每 列占用一些存储空间。尽管单个 列 不是 4字节对齐的,但 每行保留4字节(32位)用于列所需的前1-32位 ,然后再保留4字节用于位33-64,依此类推。 BIT(M)MBITNDBBIT

虽然NULL本身本身不需要任何存储空间,但是NDB如果表定义包含允许NULL最多32 NULL列的任何列, 则每行保留4个字节。(如果定义的NDB群集表包含32 NULL列以上至64 NULL列,则每行保留8个字节。)

使用NDB存储引擎的每个表都需要一个主键;如果不定义主键,NDB将创建一个“隐藏”主键。这个隐藏的主键每个表记录消耗31-35个字节。

可以使用ndb_size.pl Perl脚本来估计ndb存储需求。它连接到当前的MySQL(不是NDB集群)数据库,并创建一个报告,说明如果使用NDB存储引擎,该数据库将需要多少空间。

数值类型存储要求

数据类型 需要存储

TINYINT 1个字节

SMALLINT 2字节

MEDIUMINT 3个字节

INT, INTEGER 4字节

BIGINT 8字节

FLOAT(p) 如果0 <= p<= 24,则为4个字节;如果25 <= p<= 53 ,则为8个字节

FLOAT 4字节

DOUBLE [PRECISION], REAL 8字节

DECIMAL(M,D), NUMERIC(M,D) 变化; 见下面的讨论

BIT(M) 约(M+7/ 8字节

值DECIMAL(和 NUMERIC)列的值使用二进制格式表示,该格式将九个十进制(以10为基数)数字压缩为四个字节。每个值的整数部分和小数部分的存储分别确定。每9位数字的倍数需要4个字节,“剩余”的数字需要4个字节的一部分。下表给出了多余数字所需的存储空间。

剩余数字 字节数

0 0

1个 1个

2 1个

3 2

4 2

5 3

6 3

7 4

8 4

日期和时间类型存储要求

对于TIME, DATETIME和 TIMESTAMP列,在MySQL 5.6.4之前创建的表所需的存储与从5.6.4以后创建的表所需的存储不同。这是由于5.6.4中的更改,允许这些类型具有小数部分,需要0到3个字节。

数据类型 MySQL 5.6.4之前需要存储 从MySQL 5.6.4开始需要存储

YEAR 1个字节 1个字节

DATE 3个字节 3个字节

TIME 3个字节 3字节+小数秒存储

DATETIME 8字节 5字节+小数秒存储

TIMESTAMP 4字节 4字节+小数秒存储

从MySQL 5.6.4开始, YEAR和 DATE的存储保持不变。然而 TIME, DATETIME和 TIMESTAMP以不同方式表示。DATETIME的打包效率更高,非小数部分需要5个字节,而不是8个字节,并且这三个部分的小数部分都需要0到3个字节,具体取决于存储值的小数秒精度。

分数秒精度 需要存储

0 0字节

一二 1个字节

3 4 2字节

5、6 3个字节

例如,TIME(0), TIME(2), TIME(4),和 TIME(6)分别使用3、4、5和6字节。TIME并且 TIME(0)是等价的,需要相同的存储空间。

字符串类型存储要求

在下表中,M以字符表示非二进制字符串类型的已声明列长度,以二进制字符串类型表示字节。 L表示给定字符串值的实际长度(以字节为单位)。

数据类型

需要存储

CHAR(M)

紧凑的InnoDB行格式系列优化了可变长度字符集的存储。请参阅 COMPACT行格式存储特征。否则,M× w字节255,其中 为字符集中最大长度字符所需的字节数。<= M <=w

BINARY(M)

M字节,0 255<= M <=

VARCHAR(M), VARBINARY(M)

L如果列值需要0到255个字节,则L+ 1个字节;如果值可能需要超过255个字节,则+ 2个字节

TINYBLOB, TINYTEXT

L+ 1个字节,其中 L<2 的8次方

BLOB, TEXT

L+ 2个字节,其中 L<2 的1次方6

MEDIUMBLOB, MEDIUMTEXT

L+ 3个字节,其中 L<2 的24次方

LONGBLOB, LONGTEXT

L+ 4个字节,其中 L<2 的32次方

ENUM('value1','value2',...)

1或2个字节,取决于枚举值的数量(最大65,535个值)

SET('value1','value2',...)

1、2、3、4或8个字节,具体取决于集合成员的数量(最多64个成员)

可变长度字符串类型使用长度前缀和数据进行存储。长度前缀需要1到4个字节,具体取决于数据类型,前缀的值为L(字符串的字节长度)。例如,存储MEDIUMTEXT值需要L个字节来存储该值,再加上3个字节来存储该值的长度。

要计算用于存储特定CHAR、VARCHAR或TEXT列值的字节数,必须考虑该列使用的字符集以及该值是否包含多字节字符。特别是,当使用utf8 Unicode字符集时,必须记住并非所有字符都使用相同的字节数。utf8mb3和utf8mb4字符集分别最多需要3和4个字节。

VARCHAR、VARBINARY以及BLOB和TEXT类型都是可变长度类型。对于每种情况,存储要求取决于以下因素:

列值的实际长度

列的最大可能长度

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

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

可以存储在VARCHAR或VARBINARY列中的有效最大字节数取决于所有列之间共享的最大行大小65535字节。对于存储多字节字符的VARCHAR列,有效的最大字符数较少。例如,utf8mb4字符每字符最多需要4个字节,因此使用utf8mb4字符集的VARCHAR列可以声明为最多16383个字符。见第8.4.7节,“表格列数和行大小限制”。

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

NDB存储引擎支持可变宽度列。这意味着NDB集群表中的VARCHAR列需要与任何其他存储引擎相同的存储量,但这些值是4字节对齐的。因此,使用latin1字符集存储在VARCHAR(50)列中的字符串'abcd'需要8个字节(而不是MyISAM表中相同列值的5个字节)。

在NDB中,文本列和BLOB列的实现方式不同;文本列中的每一行由两个独立的部分组成。其中一个是固定大小(256字节),实际存储在原始表中。另一个由超过256字节的任何数据组成,这些数据存储在一个隐藏表中。第二个表中的行总是2000字节长。这意味着,如果大小<=256,则文本列的大小为256(其中大小表示行的大小);否则,大小为256+大小+(2000×(大小−256)%2000)。

枚举对象的大小由不同枚举值的数目决定。一个字节用于最多255个可能值的枚举。两个字节用于具有256到65535个可能值的枚举。

集合对象的大小由不同集合成员的数目决定。如果设置的大小为N,则对象占用(N+7)/8字节,四舍五入为1、2、3、4或8字节。一个集合最多可以有64个成员。

JSON存储要求

通常,JSON列的存储需求与LONGBLOB或LONGTEXT列的存储需求大致相同;也就是说,JSON文档所占用的空间与存储在这些类型之一的列中的文档字符串表示形式所占用的空间大致相同。但是,二进制编码(包括查找所需的元数据和字典)会增加存储在JSON文档中的单个值的开销。例如,JSON文档中存储的字符串需要4到10个字节的额外存储,这取决于字符串的长度以及存储它的对象或数组的大小。

此外,MySQL还对存储在JSON列中的任何JSON文档的大小进行了限制,使其不能大于max_allowed_packet的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值