如何限制临时表的大小?

问题描述 投票:0回答:4

我的数据库中有较大的(InnoDB)表;显然,用户能够使用 JOIN 进行 SELECT,从而生成临时的大型(因此位于磁盘上)表。有时,它们太大以至于耗尽磁盘空间,导致各种奇怪的问题。

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

mysql mariadb temp-tables
4个回答
6
投票

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

在您的 NAS 上创建一个文件夹或在内部 HDD 上创建一个分区,根据定义,它的大小会受到限制,然后挂载它,并在 mysql ini 中将临时存储分配给该驱动器:(选择 windows/linux)

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

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

使用这种方法,一旦驱动器已满,磁盘查询仍然会出现“奇怪的问题”,但其他问题都消失了。


5
投票

关于选项disk-tmp-table-size

的讨论
,但看起来提交没有通过审查或由于其他原因丢失(至少该选项在当前代码库中不再存在) )。

我猜你的下一个最佳尝试(除了增加存储空间之外)是调整 MySQL,使其不创建磁盘临时表。 DBA 上有一些这方面的技巧。另一种尝试可能是创建一个 ramdisk 来存储“磁盘上”临时表,如果您有足够的 RAM 并且仅缺少磁盘存储。


2
投票

虽然它没有回答 MySQL 的问题,但 MariaDB 有 tmp_disk_table_size 以及可能也有用的 max_join_size 设置。但是,

tmp_disk_table_size
仅适用于MyISAM或Aria表,不适用于InnoDB。此外,
max_join_size
仅适用于连接的估计行数,而不适用于实际行数。好的一面是,错误几乎立即发出。


0
投票

MariaDB 10.2.7 添加了选项

tmp_disk_table_size
,该选项在 文档中描述为:

内部临时磁盘 MyISAM 或 Aria 表的数据最大大小。当结果不适合内存引擎时,这些表将作为复杂查询的一部分创建。如果您想限制在临时目录 tmpdir 中创建的临时表的大小,您可以设置此变量。

不要让这种误导您认为它不适用于您使用 InnoDB(或其他引擎)表。磁盘上的内部临时表始终是 Aria(或 MyISAM 作为编译时选项),如此处

所述

内部临时表空间(即不能保存在内存中的临时表)使用 Aria 或 MyISAM,具体取决于 aria_used_for_temp_tables 系统变量。

有趣的是,MySQL 根据this使用InnoDB:

MySQL 8.4 仅使用 InnoDB 存储引擎作为磁盘内部临时表。 (为此目的不再支持 MYISAM 存储引擎。)

我没有找到与 MariaDB 等效的 MySQL 选项

tmp_disk_table_size

© www.soinside.com 2019 - 2024. All rights reserved.