【问题标题】:InnoDB disk usage overheadInnoDB 磁盘使用开销
【发布时间】:2011-10-15 14:13:10
【问题描述】:

我有一个包含两个 32 位整数的表。这两个整数用于创建聚集索引。创建表的SQL如下,

CREATE TABLE `a` (
  `var1` int(10) unsigned NOT NULL,
  `var2` int(10) unsigned NOT NULL,
  PRIMARY KEY (`var2`,`var1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  • 此表共有6921338行(使用SELECT COUNT(*) FROM a检索)
  • 该表使用了 358580224 字节的空间(使用 SHOW TABLE STATUS 检索)

根据我的计算,每行使用 51.8 个字节。我知道 InnoDB 在storing rows 时有开销。但是,使用 MySQL 网站,我计算出行大小应该是 26 字节(5 字节标题,8 字节整数,6 字节事务 id 和 7 字节滚动指针字段)。

我正在尝试减小行大小,因为该表可能会填充多达 1600 亿条记录。

我的计算遗漏了什么?如何优化我的表以使用更少的空间?还是应该切换到不同的数据库引擎?

更新

我对此表所做的查询;

INSERT INTO a(var1,var2) VALUES(INTEGER,INTEGER),(INTEGER,INTEGER),...,(INTEGER,INTEGER);
SELECT var1 FROM a WHERE var2=INTEGER;
DELETE FROM a WHERE var2=INTEGER;

【问题讨论】:

  • 记住 InnoDB 存储为 b-tree;这意味着树的其他非叶子部分占用了与存储的数据没有直接关系的空间。它不是基于行数的线性计算。
  • stackoverflow.com/questions/34211377/… 似乎是一个更好的答案

标签: mysql database database-design innodb


【解决方案1】:

这是因为您创建的索引也占用了空间。对于 InnoDB 中的聚集索引,行数据实际上存储在索引叶节点内,因此使用索引时,索引不会指向行,而是指向包含行数据的索引叶节点使用 PKEY。

这导致存储空间更大。

Take a look here

【讨论】:

  • 所以据我了解,行存储在 b 树的索引叶节点中。那么 b 树的空间效率是这里真正的问题吗?如果是这样,我想我可能不得不传递给另一个数据库存储引擎。
  • 是的。请问为什么存储空间是这样的问题?现在硬盘很便宜,额外的存储空间不会降低性能,反而会提高性能。
  • 存储不是什么大问题。我更好奇为什么存储 8 个字节的行需要 52 个字节。现在我知道答案了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2015-01-19
  • 2021-10-12
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多