2010-10-22 70 views
11

我们注意到,MySQL报告的临时磁盘表数量非常大(超过10,000),这是由Server Density报告的。试图更多地了解这一点。高数量的MySQL临时磁盘表

  • 为什么MySQL创建临时磁盘表?
  • 他们对性能有什么影响?
  • 他们是否曾被MySQL删除或这个数字会增加?

回答

15

临时表可以由许多原因创建。任何具有大数据集且需要排序的选择操作都将被写入一个。通过查询直接创建的实际临时表(TEMPORARY表类型)是在每个连接的基础上完成的,所以如果你有一个具有50个连接的脚本,每个连接都做同一个临时表,那为他们提供了50套磁盘临时文件。 临时表创建的原因组按照顺序排列,并且不同于 基于磁盘的I/O是DBMS中最昂贵的部分,通常情况下,如果这些表适用于大型数据集,则可能会限制数据库性能你的I/O系统。但通常情况下,它们只是咀嚼磁盘空间而不是其他东西。

用于排序目的的临时表应在查询完成时自行清理。 'TEMPORARY'类型的临时表将在它们所连接的连接关闭时自行清理。如果你使用持久连接,那么TEMPORARY表将会一直存在,直到你(或者一个程序)手动删除它们。

+0

啊我明白了,所以如果在繁忙的服务器上使用持久连接,我们可能会看到价值增加到一个很大的值,但没有什么可担心的? – Tom 2010-10-30 23:45:11

+1

取决于如何创建表。在连接中创建临时表'A'是很好的。随后重新使用连接将重新使用相同的表。但如果你使用随机名生成它们,你将泄漏这些临时表,直到连接关闭并且mysql清理完毕。 – 2010-10-31 01:55:48

+0

泄漏到磁盘到内存的位置? – Tom 2010-10-31 17:38:23

1

您已经在表格上定义了许多索引。你有没有尽管索引如何工作?

索引只是dbase中的一个临时表,它使索引列的副本保持排序。当一个新的行插入,质数据库在正确的地方提出了新的纪录在临时表这样一个指数具有以下结果:

A)优点:

1)搜索速度的增加,因为该表

1)慢下来(创建,更新,删除),因为同样的操作应在临时表如果需要做:基于索引的字段(一个或多个)

B)缺点在一个临时表进行排序。

2)数据库大小因使用临时表而增加。

结论:

索引是在大数据量的大尺寸分贝和更慢的插入和快速搜索的一个折衷。 在您经常将其引用为搜索条件(WHERE)的字段上使用索引,并删除多余的索引以优化数据库设计。

6

首先阅读the answer by Marc B这是关于为什么你有很多临时表的原因。 无论如何,临时表本身并不坏,坏的是“磁盘上的临时表”很慢,并导致大量的磁盘IO。

为了防止临时表存储在磁盘上尝试按以下步骤操作:

  • 检查max_heap_table_size的价值变量
  • 检查的tmp_table_size的变量
  • 值检查所有临时表中的磁盘表的百分比。 只需比较show global status like 'Created_tmp_%tables'这两个数字即可。 如果百分比不是太大 - 没有什么可担心的。
+0

max_heap_table_size和tmp_table_size的值是什么好/坏值? – Tom 2010-10-30 23:46:01

+0

这取决于你的很多项目的具体情况。所以没有关于价值的一般建议。我可以建议的唯一的事情就是避免使用磁盘临时表。 – Vadim 2010-11-01 09:51:37