如何让mysql内存引擎存储更多数据?

如何让mysql内存引擎存储更多数据?,mysql,memory,Mysql,Memory,我想将表从INNODB更改为内存引擎 所以我输入了这个命令: alter table sns ENGINE=内存 然后MySQL显示 ERROR 1114 (HY000): The table '#sql-738_19' is full 表的数据大小是1GB,我有8GB的内存 我检查了我的.cnf,但找不到更改最大大小设置的位置。难道我不能存储更多的数据吗?增加最大堆\u表格大小是您需要的您应该调整制作和加载表格的方式 CREATE TABLE sns_memory SELECT * FROM

我想将表从INNODB更改为内存引擎

所以我输入了这个命令:

alter table sns ENGINE=内存

然后MySQL显示

ERROR 1114 (HY000): The table '#sql-738_19' is full
表的数据大小是1GB,我有8GB的内存


我检查了我的.cnf,但找不到更改最大大小设置的位置。难道我不能存储更多的数据吗?

增加
最大堆\u表格大小

是您需要的

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

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;
这将通过和绕过任何强加的限制

同样,您需要做两件事:

将此添加到/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;

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

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

如果仍然存在问题,请记住表占用的磁盘空间通常小于内存需求。使用长度为8的字符串的VARCHAR(256)将消耗磁盘上的8个字节,但由于存储不支持动态行,它会为每个实例保留内存中的全部256字节。

内存表的最大大小是在创建和更改时设置的,并基于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\u表大小的误解

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

如合同所述:

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


如果要将其更改为内存表,为什么要担心数据的传输?你应该准备好失去它!因此,只需截断它,然后更改表…为什么要设置
tmp\u table\u size=2G
?在我的5.5服务器中,我将其保留为默认值(16Mb),并且我仍然能够在内存备份表中存储多达我的
max_heap_table_size
(~400MiB)。您也可以仅通过这样做来更改会话的上述2个变量
设置全局tmp_table_size=1024*1024*2;设置全局最大堆表大小=1024*1024*1024*2
@Mike Running
SET GLOBAL
命令完全不影响会话值。请注意,在我的帖子中,我已经提到了
SET GLOBAL
。我帖子的最后两行,
SET tmp_table_size=1024*1024*1024*2
设置最大堆表大小=1024*1024*1024*2是设置会话的内容,但它们必须在会话本身内执行。@RolandmySqlDB很抱歉,我有一个类型,它应该设置为会话tmp\u table\u size=1024*1024*2;设置SESSION max_heap_table_size=1024*1024*1024*2;在我们的案例中,需要alter语句来应用changegood stuff-感谢您澄清关于tmp_表大小的误解
# 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;