【发布时间】: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