为什么我的桌子尺寸比预期的大4倍?(行×字节/行)

Bra*_*yer 6 mysql storage innodb

我在看MySQL中一个简单的表,它有4列,大小如下,

unsigned bigint (8 bytes)
unsigned bigint (8 bytes)
unsigned smallint (2 bytes)
unsigned tinyint (1 byte)
Run Code Online (Sandbox Code Playgroud)

所以我希望19字节/行.

此表中有1,654,150行,因此数据大小应为31,428,850字节(或大约30兆字节).

但我可以通过phpMyAdmin看到数据占用136.3 MiB(不包括指数的大小bigint 1, smallint, tinyint为79 MiB).

存储引擎是InnoDB,主键是bigint 1, bigint 2(用户ID和唯一的项ID).


编辑:根据评论中的要求,这是一个结果SHOW CREATE TABLE storage

CREATE TABLE `storage` (
 `fbid` bigint(20) unsigned NOT NULL,
 `unique_id` bigint(20) unsigned NOT NULL,
 `collection_id` smallint(5) unsigned NOT NULL,
 `egg_id` tinyint(3) unsigned NOT NULL,
 PRIMARY KEY (`fbid`,`unique_id`),
 KEY `fbid` (`fbid`,`collection_id`,`egg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

mas*_*sk8 3

如果表频繁执行插入/删除/更新,您可能需要尝试运行OPTIMIZE TABLE查询来查看表可以收缩多少。数据文件中可能存在碎片整理和未使用的空间。

phpmyadmin 向您显示的数据大小不会是您所期望的。您会看到,当您第一次创建表时,它不会显示数据使用情况:0。它将是 16KB 或 32KB 或其他。当您插入记录时,大小不会改变。这就是innoDB控制表文件的方式,就像它想象的那样高效。

检查SHOW TABLE STATUS FROM {db_name}并查看表的每一行有多少 Avg_row_length。它也不会是19字节