我的数据库包含三个表,包含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倍的内存?
除了数据+索引之外,进程中还有其他内容正在占用内存吗?
机器:英特尔P4 - 1.9GHz,1.5GB内存,Win7旗舰版。
答案 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个字符,所以它在磁盘上占用了这么小的尺寸。