【问题标题】:High Number of MySQL Temporary Disk Tables大量 MySQL 临时磁盘表
【发布时间】:2010-10-22 12:43:01
【问题描述】:

我们注意到 MySQL 报告了非常多的临时磁盘表(超过 10,000 个),这是由 Server Density 报告的。正在尝试对此进行更多了解。

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

【问题讨论】:

    标签: mysql monitoring performance


    【解决方案1】:

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

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

    【讨论】:

    • 啊,我明白了,所以如果在繁忙的服务器上使用持久连接,我们可能会看到价值增长到很大的价值,但这没什么好担心的?
    • 取决于表的创建方式。在连接中创建一个临时表“A”很好。连接的后续重用只会重用同一个表。但是,如果您使用随机名称生成它们,您将泄漏这些临时表,直到连接关闭并且 mysql 清理完毕。
    • 泄漏到哪里,到磁盘,到内存?
    • 取决于表的位置。可能两者兼有,也可能只是其中之一。一切都取决于 mysql 决定使用什么。
    【解决方案2】:

    首先阅读the answer by Marc B 这是关于为什么你有很多临时表的原因。 不管怎样,临时表本身还不错,坏处是“磁盘上的临时表”,速度很慢,会导致大量磁盘 IO。

    要防止将临时表存储在磁盘上,请尝试执行以下步骤:

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

    【讨论】:

    • max_heap_table_size 和 tmp_table_size 的值什么是好/坏值?
    • 这在很大程度上取决于您的项目特定。所以没有关于价值观的一般建议。我唯一可以建议的是:避免使用磁盘上的临时表。
    【解决方案3】:

    您已经在表上定义了许多索引。你有没有想过索引是如何工作的?

    简单地说,索引是 dbase 中的一个临时表,它保存已排序的索引列的副本。当插入新行时,dbase 会在临时表中的正确位置放置一条新记录,因此索引具有以下结果:

    A) 优点:

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

    B) 缺点:

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

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

    结论:

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

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2012-01-17
      • 2017-11-15
      相关资源
      最近更新 更多