mySQL临时表已满

时间:2016-04-25 02:12:42

标签: mysql global-temp-tables

我正在尝试使用以下语法创建并将临时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,但我仍然遇到了表格中的完整错误。我是新手使用记忆引擎,所以任何建议都值得赞赏。

2 个答案:

答案 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这样的专栏店。