我有一个具有以下结构的表
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 个字节。
但是,当我在该表中插入 5 000 000 行时,.idb 表文件的实际大小为 268 MB。因此,一行使用了大约 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所以我为表“ALTER TABLE ADD INDEX foreign_id_1_index( foreign_id_1);”添加了另一个 每 1 行使用的字节数从 56 字节增加到 71 字节。附加索引之前的表文件总大小:268 MB,之后:340 MB。
看起来 PK 可能会使用 20 个额外的字节。
如果没有更多答案,我将在几个小时内关闭问题
更新 2
从11.7 数据类型存储要求:“使用 NDB 存储引擎的每个表都需要一个主键;如果您没有定义主键,则 NDB 会创建一个“隐藏”主键。这个隐藏的主键每个消耗 31-35 个字节表记录。”