我在数据库中有一些较大的(InnoDB)表格;显然,用户能够进行SELECT和JOIN操作,这将导致临时的、大的(因此位于磁盘上的)表格。有时,这些表格会变得非常庞大,以至于耗尽磁盘空间,从而导致各种奇怪的问题。
是否有一种方法可以限制临时表的最大大小,以免表格超出磁盘空间?tmp_table_size仅适用于内存中的表格,尽管名字是这样。我在文档中没有找到相关信息。
我在数据库中有一些较大的(InnoDB)表格;显然,用户能够进行SELECT和JOIN操作,这将导致临时的、大的(因此位于磁盘上的)表格。有时,这些表格会变得非常庞大,以至于耗尽磁盘空间,从而导致各种奇怪的问题。
是否有一种方法可以限制临时表的最大大小,以免表格超出磁盘空间?tmp_table_size仅适用于内存中的表格,尽管名字是这样。我在文档中没有找到相关信息。
MariaDB和MySQL中没有这个选项。几个月前我也遇到了同样的问题,搜索了很多资料,最终通过在NAS上创建一个特殊的存储区域来部分解决了它。
在您的NAS上创建一个文件夹或内部硬盘分区,它将被定义为有限的大小,然后挂载它,在mysql ini中将临时存储分配给此驱动器:(选择Windows / Linux)
tmpdir="mnt/DBtmp/"
tmpdir="T:\"
此更改后应重新启动mysql服务。
采用这种方法,一旦驱动器已满,您仍会遇到磁盘上查询的“奇怪问题”,但其他问题已消失。
有关选项disk-tmp-table-size
的讨论曾经存在过,但看起来提交的内容没有通过审核或因其他原因丢失了(至少该选项在当前代码库中不存在)。
我想你下一步最好的尝试(除了增加存储空间)是调整MySQL以避免生成磁盘上的临时表。DBA上有一些提示可以参考。另一个尝试是为“磁盘上”的临时表创建一个ramdisk,如果你有足够的RAM并且只缺少磁盘存储空间。
tmp_disk_table_size
仅适用于MyISAM或Aria表,不适用于InnoDB。此外,max_join_size
仅适用于联接的预计行数,而不是实际行数。好的方面是,错误几乎立即发出。
SELECT ...
,EXPLAIN SELECT ...
和SHOW CREATE TABLE
。缩小临时表可能会_很可能_加快速度。 - Rick Jamesmysql
标签中的答案)。不幸的是,如果数据集有数百GB,并且查询有些是动态构建的,那么我们已经尝试过很少有用的优化了。(是的,我知道大数据仓库不适合使用MySQL,更好的解决方案正在研究中 - 寻找一个临时解决方案)感谢您提供文档链接,我会将其编辑到问题中。 - Piskvor left the building