如何让mysql MEMORY ENGINE存储更多数据?

时间:2012-03-23 16:16:26

标签: mysql memory

我想将一张表从INNODB改为MEMORY ENGINE。

所以我输入了这个命令:

alter table sns ENGINE=MEMORY;

然后MySQL显示

ERROR 1114 (HY000): The table '#sql-738_19' is full

表的数据大小为1GB,我有8GB内存。

我检查了my.cnf,但我没有找到更改max_size设置的位置。我不应该能够存储更多数据吗?

5 个答案:

答案 0 :(得分:73)

您应该调整制作方式并加载表格

CREATE TABLE sns_memory SELECT * FROM sns WHERE 1=2;
ALTER TABLE sns_memory ENGINE=MEMORY;
INSERT INTO sns_memory SELECT * FROM sns;
DROP TABLE sns;
ALTER TABLE sns_memory RENAME sns;

这将解决tmp_table_sizemax_heap_table_size所施加的任何限制。

同样,你需要做两件事:

将此添加到/etc/my.cnf

[mysqld]
tmp_table_size=2G
max_heap_table_size=2G

这将涵盖mysql重启。要立即在mysqld中设置这些值而不重新启动,请执行以下命令:

SET GLOBAL tmp_table_size = 1024 * 1024 * 1024 * 2;
SET GLOBAL max_heap_table_size = 1024 * 1024 * 1024 * 2;

如果您使用

检查上述变量
SELECT @@max_heap_table_size;

SHOW VARIABLES LIKE 'max_heap_table_size';

您可能会注意到SET GLOBAL...语句后它们似乎没有变化。这是因为这些设置仅适用于与服务器的新连接。建立新连接,您将看到值更新,或者您可以通过运行以下内容在会话中更改它:

SET tmp_table_size = 1024 * 1024 * 1024 * 2;
SET max_heap_table_size = 1024 * 1024 * 1024 * 2;

答案 1 :(得分:8)

你正在寻找

max_heap_table_size

答案 2 :(得分:4)

创建和更改内存表的最大大小是根据max_heap_table_size值设置的。

因此,当您想增加现有 内存表的最大大小时,可以更改max_heap_table_size,然后通过将表更改为同一存储引擎来应用它。

示例:

# Raise max size to 4GB
SET max_heap_table_size = 1024 * 1024 * 1024 * 4;

# If already a memory table, the alter will not change anything.
# Only apply the new max size.
ALTER TABLE table_name ENGINE=MEMORY;

关于tmp_table_size的误区

tmp_table_size变量仅确定内部内存表的最大大小。不是用户定义的。

MySQL docs中所述:

内部内存临时表的最大大小。此变量不适用于用户创建的MEMORY表。

答案 3 :(得分:2)

增加max_heap_table_size

答案 4 :(得分:2)

如果您仍然遇到问题,请记住表占用的磁盘空间通常小于内存要求。使用长度为8的字符串的VARCHAR(256)将占用磁盘上的8个字节,但由于STORAGE不支持动态行,因此它为每个实例在内存中保留了完整的256个字节。