为什么报告的数据库大小(在磁盘上?)与内存中的数据库大小不同

时间:2012-09-27 20:01:41

标签: mysql innodb

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

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

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

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

为什么一个214MB的数据库,甚至不能容纳超过4倍的内存?

除了数据+索引之外,进程中还有其他内容正在占用内存吗?

机器:英特尔P4 - 1.9GHz,1.5GB内存,Win7旗舰版。

1 个答案:

答案 0 :(得分:3)

我找到this dba.se question,其中接受的答案中有this dev.mysql page的链接,其中包含:{/ p>

  

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

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

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

这个特定的列单独贡献了95%的空间,其余的来自其他数字列。我猜InnoDB没有将它以固定长度存储在磁盘上。而且因为该字段的测试值大多没有超过10-15个字符,所以它在磁盘上占用了这么小的尺寸。