提问者:小点点

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


我有一张结构如下的桌子

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)吗?我在文件中找不到任何提到这种行为或存在的问题。

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

更新

@Akina和@Jacques Ramsden正确地向我指出,我已经忘记了PK尺寸的问题。因此,我为表“alter tabledataADD INDEXforeign_id_1_index(foreign_id_1);”添加了另一个每1行使用的字节数从56字节增加到71字节。添加索引之前的表文件总大小:268 MB,之后的表文件总大小:340 MB。
看来PK可以使用20个额外的字节。

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


共1个答案

匿名用户

每张桌子上都有文件吗?如果不是,您可能忘记了索引等必须由数据库建立和维护以提高效率。

更新:

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