大量MySQL临时磁盘表

大量MySQL临时磁盘表,mysql,monitoring,performance,Mysql,Monitoring,Performance,我们注意到MySQL报告了大量的临时磁盘表(超过10000个),这是由MySQL报告的。我们试图了解更多关于这一点 为什么MySQL会创建临时磁盘表 它们对性能有什么影响 MySQL是否会删除它们,或者这个数字会增加吗 创建临时表有很多原因。任何具有大数据集且需要排序的select操作都将写入其中。由查询直接创建的实际临时表(临时表类型)是在每个连接的基础上完成的,因此,如果您有一个脚本,其中50个连接都在执行相同的临时表,那么就有50组磁盘上的临时文件。 临时表创建原因组(按订单依据和区分依

我们注意到MySQL报告了大量的临时磁盘表(超过10000个),这是由MySQL报告的。我们试图了解更多关于这一点

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

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


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

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

      简单地说,索引是数据库中的一个临时表,用于对索引列的副本进行排序。插入新行时,dbase会在临时表中的正确位置放置一条新记录,以便索引具有以下结果:

      A)优势:

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

      B)缺点:

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

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

      结论:

      索引是在较大的数据库大小和较慢的插入速度以及在大量数据中的快速搜索之间进行折衷。 对经常将其作为搜索条件(WHERE)的字段使用索引,并删除额外的索引以优化数据库设计。

      首先,请阅读这篇文章,了解为什么会有很多临时表。 无论如何,临时表本身并不坏,坏的是“磁盘上临时表”,它速度慢,并且会导致大量磁盘IO

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

      • 检查max\u heap\u table\u size变量的值
      • 检查tmp\u table\u size变量的值
      • 检查磁盘表在所有临时表中的百分比。 只需比较
        显示全局状态,如“已创建\u tmp\u%tables”
        这两个数字。 如果这个比例不是太大,那就没什么好担心的了
      啊,我明白了,所以如果在繁忙的服务器上使用持久连接,我们可能会看到值增加到一个很大的值,但这没什么好担心的?这取决于表是如何创建的。在连接中创建临时表“a”是可以的。连接的后续重用将只是重用同一个表。但是,如果您使用随机名称生成临时表,您将泄漏这些临时表,直到连接关闭,mysql清理完毕。泄漏到哪里、磁盘、内存?取决于表的位置。可能两者都有,也可能只有一个。这一切都取决于mysql决定使用什么。max_heap_table_size和tmp_table_size的值是好的还是坏的值?这取决于您的项目具体情况。因此,没有关于价值观的一般建议。我唯一能建议的是:避免使用磁盘上的临时表。