【问题标题】:MySQL user created temporary table is fullMySQL用户创建的临时表已满
【发布时间】:2013-10-18 23:05:33
【问题描述】:

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

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

当我向其中插入行时,我遇到了 #1114 错误,因为表已满。它在 mysql 文档中解释说,更改 tmp_table_size 和 max_heap_table_size 对增加用户创建的临时表的大小没有任何作用,这就是我认为我在这里所拥有的。我该如何让这张桌子变大?

我希望能够通过调用 SET 来动态执行此操作,但我尝试设置 tmp_table_size 和 max_heap_table_size,它们都远远超出了我在此表中预期的数据量。那么有谁知道如何解决这个表上的这个错误?感谢任何提供帮助的人。

【问题讨论】:

    标签: mysql memory temp-tables


    【解决方案1】:

    在 MySQL 中,默认情况下,使用内存引擎创建的临时表可以快速增长到超过 max-heap-table-size 和 tmp-table-size 的 16mb 限制em> 因为每行分配的内存比通常需要的多。在您提供的示例中, VARCHAR(400) 将根据最大字符串大小而不是数据的实际大小分配内存。每个字符可能需要超过 1 个字节来存储。假设每行需要 2kb,那么只需要 8k 行即可达到限制。

    对于许多应用程序,可以通过使用 ROW_FORMAT=DYNAMIC 来解决此问题,如下所述:

    http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html

    【讨论】:

      【解决方案2】:

      max_heap_table_size 是对使用 MEMORY 存储引擎的 any 表(临时或其他)大小的限制。您必须增加此配置选项才能在表中存储更多数据。

      【讨论】:

      • 谢谢比尔,你总是有明确的 MySQL 建议。作为注释。我将此表创建为存储过程的一部分。我不知道我是否可以负责任地增加整个数据库上的max_heap_table_size。使用set max_heap_table_size = 33554432 仅为我的存储过程设置限制,然后在完成运行后可能将其设置回来是明智的吗?再次感谢。
      • 是的,max_heap_table_size 可以设置会话范围(参见dev.mysql.com/doc/refman/5.6/en/…),因此您可以在有限的影响下进行更改。
      • 即使将 max_heap_table_size 和 tmp_table_size 增加到 4G,我仍然收到“完整”消息!
      • @ButtleButkus,你存储在表中的数据可能大于4G。
      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2013-03-01
      • 2016-03-15
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多