我正在尝试使用以下语法创建临时 mySQL 表并将其加载到内存中,但遇到“表已满”错误:
CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE=MEMORY SELECT * FROM history ORDER BY date ASC;
我的原始历史记录 InnoDB 表有大约 300 万行和大约 300mb。我增加了以下两个服务器变量的默认值 16mb:
最大堆表大小 = 536870912
tmp_table_size = 536870912
我在 AWS r3.xlarge 上运行 mySQL,这是一个具有 30.5GB RAM 的 4 核机器。
我已经查看了 this SO guidance,但仍然遇到 Table is Full 错误。我刚开始使用内存引擎,因此欢迎任何建议。
最佳答案
max_heap_table_size
,而不是 tmp_table_size
控制任何后续 MEMORY
表的最大大小。
MEMORY
有几个怪癖。也许这让您有点不适应:VARCHARs
被转换为 CHARs
。因此,如果 CHARACTER SET utf8
,VARCHAR(255)
每行占用 765 个字节。
为什么要把一个完美的InnoDB表复制到一个MEMORY表中?为了避免磁盘命中?不...如果 innodb_buffer_pool_size
足够大,InnoDB 表将有效地存在于 RAM 中。加快速度?不一定,因为InnoDB有行锁,而MEMORY只有表锁。
请提供SHOW CREATE TABLE
;可能还有其他事情可以反驳您正在做的事情和/或解释为什么会出现错误。
关于mySQL 临时表已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831067/