我的数据库包含三个表,包含50k,50k和5m行.所有这些都是InnoDB.(最大的一个包含varchar [256]).我的数据库大小是214MB,我通过查询获得information_schema.TABLES(我想这给出了数据的大小+磁盘上的索引?)
我有1.5GB的RAM,我想我会将所有表的引擎转换为MEMORY.但是当我开始转换最大的表时,我得到1114错误.
经过一番研究,我发现max_heap_table_size只有16MB.所以,我设置max_heap_table_size和tmp_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 个字符,因此它在磁盘上占用的空间很小。