mysql - 为什么我的 table 尺寸比预期大 4 倍以上? (行*字节/行)

标签 mysql storage innodb

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

unsigned bigint (8 bytes)
unsigned bigint (8 bytes)
unsigned smallint (2 bytes)
unsigned tinyint (1 byte)

所以我希望每行 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

最佳答案

如果表经常进行插入/删除/更新,您可能想尝试运行 OPTIMIZE TABLE 查询以查看表可以缩小多少。数据文件中可能存在碎片整理和未使用的空间。

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

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

关于mysql - 为什么我的 table 尺寸比预期大 4 倍以上? (行*字节/行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11526734/

相关文章:

python - 如何打破azure python SDK中已存在的租约

mysql如何确定删除时做什么?级联、限制?

mysql - 如何从与外键连接的表中删除行?

mysql - 如何合并两个完全相同的表?

php - 如何在 Cakephp 3 中调用 PDOStatement::nextRowset()

file - 在网站中存储用户上传的文件的最佳方法是什么?

android - 将图像存储在内部存储器中

MySql 使用 InnoDB 回收 blob 空间

mysql - 连接多个 MySQL 表进行搜索。这是 MySQL View 的一个很好的用途吗?

mysql - 更新和插入查询之间的死锁