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

Bin*_*Hsu 36 mysql memory

我想将一个表从INNODB改为MEMORY ENGINE.

所以我输入了这个命令:

alter table sns ENGINE=MEMORY;

然后MySQL显示

ERROR 1114 (HY000): The table '#sql-738_19' is full
Run Code Online (Sandbox Code Playgroud)

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

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

Rol*_*DBA 76

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

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;
Run Code Online (Sandbox Code Playgroud)

这将通过tmp_table_sizemax_heap_table_size来解决任何强加的限制.

同样,你需要做两件事:

将其添加到/etc/my.cnf

[mysqld]
tmp_table_size=2G
max_heap_table_size=2G
Run Code Online (Sandbox Code Playgroud)

这将涵盖mysql重启.要立即在mysqld中设置这些值而不重新启动运行:

SET GLOBAL tmp_table_size = 1024 * 1024 * 1024 * 2;
SET GLOBAL max_heap_table_size = 1024 * 1024 * 1024 * 2;
Run Code Online (Sandbox Code Playgroud)

如果您正在检查上述变量

SELECT @@max_heap_table_size;
Run Code Online (Sandbox Code Playgroud)

要么

SHOW VARIABLES LIKE 'max_heap_table_size';
Run Code Online (Sandbox Code Playgroud)

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

SET tmp_table_size = 1024 * 1024 * 1024 * 2;
SET max_heap_table_size = 1024 * 1024 * 1024 * 2;
Run Code Online (Sandbox Code Playgroud)


the*_*per 7

内存表的最大大小是在创建和更改时设置的,并且基于 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;
Run Code Online (Sandbox Code Playgroud)

关于 tmp_table_size 的误解

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

正如MySQL 文档中所述:

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