2011-11-21 56 views
6

我正在运行一个查询来创建一个临时表,但是这个限制是64mb,并且我无法更改由于访问权限等原因造成的限制。选择一个较大的日期范围临时表空间不足并导致mysql错误。mysql - 我可以确定或限制允许使用的内存查询量

是否有无论如何我可以确定查询在尝试运行查询之前将使用的内存大小或内存量,所以我可以优雅地避免上述问题?

回答

3

除了在基本SQL查询中查询更少数量的行之外,没有办法直接限制临时表的大小。

您能更具体地了解您所看到的错误吗? MySQL临时表可以在内存中存在,直到较小的tmp_table_sizemax_heap_table_size。如果临时表更大,MySQL会将其转换为磁盘上的临时表。

这将使临时表比内存中的存储慢很多,但除非you have no space available in your temp directory不应该导致错误。

除了临时表存储之外,还有很多ways MySQL uses memory。您可以调整其中的许多变量,但这与对查询使用的内存设置限制并不相同。


错误1114表明您已经用完了空间。如果它是磁盘上的InnoDB表,这可能意味着您有一个没有为表空间定义自动扩展的ibdata1文件。对于内存表来说,这意味着你正在达到max_heap_table_size的极限。

由于您无法更改max_heap_table_size,因此您的选择是一次减少放入表中的行数,或者使用磁盘上的临时表而不是内存中的行。

还要小心使用最新版本的MySQL的最新版本。我发现bug 18160报告不正确地为堆表(用于内存临时表)的MySQL计算表大小。例如,确保您至少使用MySQL 5.0.23或5.1.10来获得该错误的修复。

+0

感谢您的回复,该错误信息即时得到是 [本地代码:1114] [本地消息:表“dertemp”充满] –

+0

我将如何使用磁盘上的临时表 的开始我的查询看起来像 'CREATE TEMPORARY TABLE erebus.dertemp SELECT等去这里' 我想我需要改变第一个位,并把'磁盘上'在那里? –

+0

'CREATE TEMPORARY TABLE erebus.dertemp ENGINE = InnoDB SELECT ...' –

1

我不知道有一个直接的方法来完成此操作,但是您可以使用SHOW TABLE STATUS提供的有关使用表的信息,例如平均行大小,然后使用SELECT COUNT(*) ...计算您的查询返回的记录数。如果您需要真正保存,请使用列类型计算行的最大大小。

也许可以更容易地检查可处理的记录数,然后指定固定的LIMIT子句或对SELECT COUNT(*) ...作出反应。

相关问题