4

我正在尝试使用以下语法创建临时 mySQL 表并将其加载到内存中,但遇到“表已满”错误:

CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE=MEMORY SELECT * FROM history ORDER BY date ASC;

我原来的历史 InnoDB 表有大约 3m 行和大约 300mb。我已经从 16mb 的默认值增加了以下两个服务器变量:

max_heap_table_size = 536870912

tmp_table_size = 536870912

我在 AWS r3.xlarge 上运行 mySQL,这是一个具有 30.5GB RAM 的 4 核机器。

我已经查看了此 SO 指南,但仍然遇到 Table is Full 错误。我是使用内存引擎的新手,所以任何建议都值得赞赏。

4

2 回答 2

3

max_heap_table_size,不tmp_table_size控制任何后续MEMORY表的最大大小。

MEMORY有几个怪癖。也许这一点你: VARCHARs变成了CHARs。因此VARCHAR(255),如果 a 是 ,则每行需要 765 个字节CHARACTER SET utf8

为什么要将一个完美的 InnoDB 表复制到 MEMORY 表中?为了避免磁盘命中?不...如果innodb_buffer_pool_size足够大,InnoDB 表将有效地存在于 RAM 中。为了加快速度?不一定,因为 InnoDB 有行锁而 MEMORY 只有表锁。

请提供SHOW CREATE TABLE;可能还有其他事情可以反对您正在做的事情和/或解释您为什么会出错。

于 2016-04-27T06:11:00.340 回答
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 这样的列存储。

于 2016-04-25T05:16:23.657 回答