大量MySQL临时磁盘表

时间:2010-10-22 12:43:02

标签: mysql monitoring performance

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

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

3 个答案:

答案 0 :(得分:15)

可以出于很多原因创建临时表。任何具有大数据集并需要排序的选择操作都将写入一个。由查询直接创建的实际临时表(TEMPORARY表类型)是基于每个连接完成的,因此如果您有一个包含50个连接的脚本,每个连接执行相同的临时表,那么它们就有50组磁盘上的临时文件。 临时表创建原因组按顺序和不同 基于磁盘的i / o通常是DBMS中最昂贵的部分,因此如果这些表用于大型数据集,则可能会将DB性能限制为I / O系统的性能。但一般来说,只是现有的,他们只是在占用磁盘空间而不是其他东西。

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

答案 1 :(得分:7)

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

要防止临时表存储在磁盘上,请尝试按照以下步骤操作:

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

答案 2 :(得分:1)

您已在表上定义了许多索引。你有没有关于索引如何工作?

只是索引是dbase中的临时表,它保留索引列的副本。插入新行时,dbase会将临时表中的新记录放在正确的位置,以便索引具有以下结果:

A)优点:

1)提高搜索速度,因为该表是基于索引字段在临时表中排序的

B)缺点:

1)减速(创建,更新,删除),因为如果需要,应该对临时表执行相同的操作。

2)由于使用临时表,数据库大小增加。

<强>结论:

索引是较大数据库大小和较慢插入以及快速搜索大量数据的权衡。 在经常将它们作为搜索条件(WHERE)引用的字段上使用索引,并删除额外的索引以优化数据库设计。