我正在尝试使用以下语法创建并将临时mySQL表加载到内存中但遇到“表已满”错误:
CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE=MEMORY SELECT * FROM history ORDER BY date ASC;
我原来的历史InnoDB表有大约3米行和大约300mb。我已经从它们的16mb默认值增加了以下两个服务器变量:
max_heap_table_size = 536870912
tmp_table_size = 536870912
我在AWS r3.xlarge上运行mySQL,这是一个4核盒子,内存为30.5GB。
我已经审核了this SO guidance,但我仍然遇到了表格中的完整错误。我是新手使用记忆引擎,所以任何建议都值得赞赏。
答案 0 :(得分:3)
max_heap_table_size
,而不是tmp_table_size
控制任何后续MEMORY
表的最大大小。
MEMORY
有几个怪癖。也许这一点:VARCHARs
变为CHARs
。因此VARCHAR(255)
每行需要765个字节,如果它是CHARACTER SET utf8
。
为什么要将一个非常好的InnoDB表复制到MEMORY表中?为了避免磁盘命中?不...如果innodb_buffer_pool_size
足够大,InnoDB表将有效地存在于RAM中。为了加快速度?不一定,因为InnoDB有行锁,但MEMORY只有表锁。
请提供SHOW CREATE TABLE
;可能还有其他事情要反对你在做什么和/或解释你为什么会得到错误。
答案 1 :(得分:1)
使用engine = memory
找出你创建的所有表格select table_name,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
from information_schema.tables
where table_schema = 'db1' and engine = 'memory';
使用top命令查看正在消耗多少内存的进程。如果是非常大的表,请避免使用内存。想想像Amazon RedShift这样的专栏店。