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

5 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倍的内存?

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

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

小智 3

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

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

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

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

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