int类型需要4字节还是8字节的MySQL实际存储大小



我有一个具有以下结构的表

CREATE TABLE `data`(
`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
`foreign_id_1` INT NOT NULL,
`foreign_id_2` INT NOT NULL,
`foreign_id_3` INT NOT NULL,
`start_dt` DATETIME NOT NULL,
`end_dt` DATETIME,
`duration_s` INT
) ENGINE = INNODB;

1行的计算大小为36字节:4x5+2x8。每个INT字段4个字节,每个DATETIME字段8个字节。

然而,当我在这个表中插入5000 000行时,.idb表文件的实际大小是268MB。因此,一行使用了大约56个字节:268 MB/5 000 000 ~ 56.2036

你知道为什么会这样吗?INT实际使用8字节而不是4(8x5+2x8=56(吗?我在文件中找不到任何关于这种行为的提及,也找不到存在的SO问题。

MySQL服务器版本:5.7.26(x86_64(
操作系统:Windows 7 64位
存储:SSD 128GB
文件系统:NTFS

更新

@akina和@Jacques Ramsden正确地向我指出,我已经忘记了PK的大小。所以我为表"添加了另一个;改变表data添加索引foreign_id_1_index(foreign_id_1("并且每1行的字节使用已经从56个字节增加到71个字节。添加索引之前的表文件的总大小:268 MB,之后的表文件大小:340 MB
看起来PK可能会使用另外20个字节。

如果没有更多答案,我将在几个小时内结束这个问题

更新2

11.7数据类型存储要求:"使用NDB存储引擎的每个表都需要一个主键;如果不定义主键,NDB将创建一个"隐藏"主键。这个隐藏的主键每个表记录消耗31-35个字节">

上有每个表的文件吗?如果没有,你可能会忘记,为了有效性,数据库必须建立和维护索引等。

更新:

当使用每个表的inonDB文件创建表时。数据文件/表空间包含数据和索引。这可以解释你的体型差异。请注意,pk或fk条目越多,索引使用就会越多。

相关内容

最新更新