我有一张结构如下的桌子
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 tabledata
ADD INDEXforeign_id_1_index
(foreign_id_1
);”添加了另一个每1行使用的字节数从56字节增加到71字节。添加索引之前的表文件总大小:268 MB,之后的表文件总大小:340 MB。
看来PK可以使用20个额外的字节。
如果没有更多的答案,我将在几个小时内结束这个问题
每张桌子上都有文件吗?如果不是,您可能忘记了索引等必须由数据库建立和维护以提高效率。
更新:
当每个表都使用inonDB文件创建表时。数据文件/表空间包含数据和索引。这可以解释你的体型差异。注意,pk或fk条目越多,索引使用量就越多。