InnoDB磁盘使用开销

Utk*_*glu 5 mysql database database-design innodb

我有一个表,其中包含两个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;
Run Code Online (Sandbox Code Playgroud)
  • 该表中有6921338行(使用检索SELECT COUNT(*) FROM a
  • 该表使用358580224字节的空间(使用检索SHOW TABLE STATUS

根据我的计算,每一行使用51.8个字节。我知道InnoDB在存储行时会产生开销。但是,使用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;
Run Code Online (Sandbox Code Playgroud)

bas*_*sh- 5

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

这导致存储要大得多。

看看这里