我有一个查询停滞了,但我不知道为什么。它看起来合理,但它“永远”运行(我去吃午饭了,让它继续运行,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”,它将基于内存而不是基于磁盘。