MySQL 在“复制到 tmp 表”时将文件存储在哪里

MySQL 在“复制到 tmp 表”时将文件存储在哪里

我有一个查询停滞了,但我不知道为什么。它看起来合理,但它“永远”运行(我去吃午饭了,让它继续运行,20 分钟后还没完成)。

查看“SHOW PROCESSLIST”,我看到我的连接状态为“复制到临时表”。

我查看了我的 my.cnf,看起来临时文件应该在 /tmp 中,但其中没有与 MySQL 相关的任何内容(只有 2 个目录,都是空的)。

为了帮助我诊断出问题所在,我想看看它应该复制到的临时文件。如果它很大,我一定是搞砸了一个查询。如果不是,也许这是一个错误。

但我不知道它们存储在哪里。它是内存中的“文件”吗?

我在 Ubuntu 9.04 JeOS 安装上运行 MySQL 5.1.31。

答案1

许多临时表可以且将在内存中创建。表是在内存中还是在磁盘上创建取决于几个因素,例如表的大小、结构(是否具有 BLOB)等。

我建议你读一下TMP_TABLE_SIZE 和 MAX_HEAP_TABL\E_SIZE了解临时表的工作原理。

您可以检查输出

mysql> show status like '%tmp%';

如果您实际上正在创建磁盘表。但请注意,实际的临时表文件对于确定是否存在问题几乎没有帮助。

您还可以尝试解释您的查询并查看其性能如何。

答案2

在 debian 中 - 默认在 /tmp [ afair ]

如有疑问,只需运行

lsof|grep -i mysqld

mysql 的临时文件在创建后立即被删除 - 它们显示在 lsof 上,但不在 ls 中;它们确实占用磁盘空间,直到文件句柄被关闭。

答案3

这取决于临时表的类型。如果显示“复制到临时表”,则表示这是内存中的副本。如果显示“复制到磁盘上的临时表”,则表示它已超出内存中临时表的大小,并且正在转储到磁盘。

如果是后者,它将被存储在变量定义的位置tmpdir。您可以通过以下方式找出设置的内容:

SHOW VARIABLES LIKE 'tmpdir';

答案4

有一个 mysql 变量指示文件将存储在哪里:

mysql> show variables like '%tmp%';

查找 tmpdir 变量。它将告诉您临时文件的存储位置。如果临时表小于“tmp_table_size”,它将基于内存而不是基于磁盘。

相关内容