MySQL用户创建的临时表已满

11

我使用内存引擎创建了一个临时表,代码如下:

CREATE TEMPORARY TABLE IF NOT EXISTS some_text (
    id INT DEFAULT 0,
    string varchar(400) DEFAULT ''
) engine = memory;

当我向其中插入行时,我遇到了#1114错误,因为表已满。 mysql文档解释说更改tmp_table_sizemax_heap_table_size对于增加用户创建的临时表的大小没有任何作用,这就是我认为我在这里所遇到的情况。如何才能使这个表变得更大?
我希望能够通过调用SET动态地完成这个操作,但我已经尝试过设置tmp_table_sizemax_heap_table_size,它们都远远超出了我预期在这个表中要存储的数据量。那么,有人知道如何解决这个表上的错误吗?感谢所有提供帮助的人。
2个回答

15

max_heap_table_size 是对使用 MEMORY 存储引擎的任何表(临时表或其他表)大小的限制。您需要增加此配置选项以在表中存储更多数据。


1
谢谢Bill,您总是提供清晰的MySQL建议。顺便说一下,我是作为存储过程的一部分创建了这个表的。我还不知道是否可以负责地增加整个数据库中的max_heap_table_size。在我的存储过程中仅使用set max_heap_table_size = 33554432来设置限制,然后在其完成运行后可能会将其设置回去,这样做是否明智?再次感谢。 - usumoio
1
是的,max_heap_table_size 可以在会话范围内设置(参见 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_heap_table_size),因此您可以在有限的影响下进行更改。 - Bill Karwin
1
我将 max_heap_table_sizetmp_table_size 增加到 4G,但仍然收到“full”消息! - Buttle Butkus
1
@ButtleButkus,您在表中存储的数据可能大于4G。 - Bill Karwin

3
在MySQL中,默认情况下,使用memory引擎创建的临时表可能很快超出max-heap-table-sizetmp-table-size的16mb限制,因为每行分配的内存比通常所需的要多。在您提供的示例中,VARCHAR(400)将根据最大字符串大小分配内存,而不是实际数据的大小。每个字符可能需要超过1个字节的存储空间。假设每行需要2kb,则只需要8k行即可达到限制。
对于许多应用程序,可以通过使用 ROW_FORMAT = DYNAMIC 来解决此问题,如下所述: http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接