mysql - 我可以确定或限制允许使用的内存查询量

时间:2011-11-21 16:29:16

标签: mysql

我正在运行一个创建临时表的查询但是限制为64mb,由于访问权限等原因我无法更改限制。当选择较大的日期范围时,临时表空间不足并导致一个mysql错误。

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

2 个答案:

答案 0 :(得分: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文件没有为表空间定义autoextend。对于内存表,这意味着您达到了max_heap_table_size的限制。

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

使用MySQL主要版本的最新版本也要小心。我发现bug 18160报告MySQL计算表大小错误的堆表(用于内存临时表)。因此,例如,确保您至少使用MySQL 5.0.23或5.1.10来获取该错误的修复程序。

答案 1 :(得分:1)

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

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