我正在尝试使用以下语法创建并将临时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,但我仍然遇到表格是完全错误.我是新手使用内存引擎,所以任何建议都表示赞赏.
解决方法:
max_heap_table_size,而不是tmp_table_size控制任何后续MEMORY表的最大大小.
MEMORY有几个怪癖.也许这就是你:VARCHARs变成了CHAR.因此,如果VARCHAR(255)是CHARACTER SET utf8,则每行需要765个字节.
为什么要将完美的InnoDB表复制到MEMORY表中?为了避免磁盘命中?不…如果innodb_buffer_pool_size足够大,InnoDB表将有效地存在于RAM中.为了加快速度?不一定,因为InnoDB有行锁,但MEMORY只有表锁.
请提供SHOW CREATE TABLE;可能还有其他事情要反对你在做什么和/或解释你为什么会得到错误.
标签:mysql,global-temp-tables
来源: https://codeday.me/bug/20190623/1269309.html