5

我的数据库包含三个表,分别有 50k、50k 和 5m 行。它们都是 InnoDB。(最大的一个包含 varchar[256])。我的数据库大小是 214MB,我通过查询得到的information_schema.TABLES(我猜这给出了磁盘上数据+索引的大小?)

我有 1.5GB 的 RAM,我想我会将所有表的引擎转换为 MEMORY。但是当我开始转换最大的表时,我得到了 1114 错误。

经过一番研究,我发现max_heap_table_size只有 16MB。因此,我将max_heap_table_sizeand设置tmp_table_size为 1GB。

当我再次尝试转换时,我看到mysqld.exe进程的内存使用量超过 1.2GB,然后在转换一半行之前再次抛出同样的错误!我从最大的表中删除了一半的行,它终于适合了——内存为 700MB!

为什么一个214MB的数据库,竟然装不下4倍多的内存?

除了数据+索引之外,进程中还有其他东西在消耗内存吗?

机器:Intel P4 - 1.9GHz,1.5GB RAM,Win7 Ultimate。

4

1 回答 1

3

我找到了这个 dba.se 问题,其中接受的答案有一个指向这个 dev.mysql 页面的链接,上面写着:

MEMORY 表使用固定长度的行存储格式。VARCHAR 等可变长度类型使用固定长度存储。

就像我在问题中提到的那样,我有一个 5m 行的表,其中有一个 varchar[256] 列。

5,000,000 x 256 = 1.19G(假设每个字符 1 个字节),所以我认为这就是答案!

仅该特定列就占了 95% 的空间,其余的来自其他数字列。我猜 InnoDB 没有将它以固定长度存储在磁盘上。而且由于该字段的测试值大多不超过 10 - 15 个字符,因此它在磁盘上占用的空间非常小。

于 2012-09-28T06:39:59.553 回答