2017-04-25 102 views
11

我在数据库中有很大的(InnoDB)表;显然用户有能力通过JOIN制作SELECT,这会导致临时的大型磁盘(因此磁盘)表。有时候,这些文件太大以至于会耗尽磁盘空间,导致各种奇怪的问题。如何限制临时表的大小?

有没有办法限制临时表最大大小对于磁盘上的表,以便表不会过度生长磁盘?尽管名称存在,但tmp_table_size仅适用于内存表。我在documentation中没有找到任何相关内容。

+0

是的,*我知道存储很便宜,最好的解决方案是“防止查询”。但是,这些不在我目前的选项中。 – Piskvor

+0

可以重新制定一些“巨大的”查询以避免大的tmp表。你可以改变查询吗?如果是这样,请为每个相关表提供'SELECT ...','EXPLAIN SELECT ...'和'SHOW CREATE TABLE'。缩小tmp表将会加快速度。 –

+1

以下是指导原则(https://dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html),可以帮助您优化您的查询。 –

回答

4

还有was a discussion关于选项disk-tmp-table-size,但它看起来像the commit没有通过审查或因其他原因而丢失(at least the option does not exist in the current code base anymore)。

我想你的下一个最好的尝试(除了增加存储空间)是调整MySQL不制作磁盘临时表。 There are some tips for this on DBA。另一个尝试可能是创建一个用于存储“磁盘上”临时表的ramdisk,前提是您有足够的RAM并且只有磁盘存储空间不足。

+0

10多年以后会发生很多事情;我没有在我的任何服务器上找到这个选项。感谢您提供in-RAM建议,但可惜:对于250 GB的临时表,这比“获取磁盘”的可能性更小。 – Piskvor

+0

这似乎是目前唯一的选择。我也无法找到关于它的更多信息。 –

+0

是的,我也是。因此,赏金。 – Piskvor

1

在MariaDB和MySQL中没有这个选项。 几个月前,我遇到了同样的问题,我搜索了很多,我最终通过在NAS上为临时数据集创建了一个特殊的存储区域来部分地解决了这个问题。

在NAS上创建一个文件夹,或者在内部硬盘上创建一个分区,它的大小将被限制,然后挂载,然后在mysql ini中分配临时存储到这个驱动器:(选择windows/linux)

tmpdir="mnt/DBtmp/" 
tmpdir="T:\" 

mysql服务应该在此更改后重新启动。

通过这种方法,一旦硬盘满了,磁盘上的查询仍然存在“奇怪的问题”,但其他问题已经消失。

+0

虽然不是完整的解决方案,但这似乎是唯一可行的解​​决方法。谢谢。 – Piskvor