【发布时间】:2010-10-22 12:43:01
【问题描述】:
我们注意到 MySQL 报告了非常多的临时磁盘表(超过 10,000 个),这是由 Server Density 报告的。正在尝试对此进行更多了解。
- 为什么 MySQL 会创建临时磁盘表?
- 它们对性能有什么影响?
- 它们是否曾经被 MySQL 删除,或者这个数字只会增加?
【问题讨论】:
标签: mysql monitoring performance
我们注意到 MySQL 报告了非常多的临时磁盘表(超过 10,000 个),这是由 Server Density 报告的。正在尝试对此进行更多了解。
【问题讨论】:
标签: mysql monitoring performance
可以出于多种原因创建临时表。任何具有大数据集并需要排序的选择操作都将被写入一个。由查询直接创建的实际临时表(TEMPORARY 表类型)是在每个连接的基础上完成的,所以如果你有一个脚本,其中有 50 个连接,每个连接都在执行相同的临时表,那就是 50 组磁盘临时文件。 . 临时表创建原因 group by order by 和 distinct by 通常,基于磁盘的 i/o 是 DBMS 中最昂贵的部分,因此如果这些表用于大型数据集,您可能会将 DB 性能限制为 i/o 系统的性能。但一般来说,它们只是存在,只会占用磁盘空间,不会占用太多空间。
用于排序的临时表应在查询完成时自行清理。 'TEMPORARY' 类型的临时表将在它们附加到的连接关闭时自行清理。如果您使用的是持久连接,那么 TEMPORARY 表将一直存在,直到您(或程序)手动删除它们。
【讨论】:
首先阅读the answer by Marc B 这是关于为什么你有很多临时表的原因。 不管怎样,临时表本身还不错,坏处是“磁盘上的临时表”,速度很慢,会导致大量磁盘 IO。
要防止将临时表存储在磁盘上,请尝试执行以下步骤:
show global status like 'Created_tmp_%tables' 这两个数字。
如果百分比不是太大 - 没有什么可担心的。 【讨论】:
您已经在表上定义了许多索引。你有没有想过索引是如何工作的?
简单地说,索引是 dbase 中的一个临时表,它保存已排序的索引列的副本。当插入新行时,dbase 会在临时表中的正确位置放置一条新记录,因此索引具有以下结果:
A) 优点:
1) 提高搜索速度,因为表是基于索引字段在临时表中排序的
B) 缺点:
1) 放慢速度(创建、更新、删除),因为如果需要,应该对临时表执行相同的操作。
2) 使用临时表会增加数据库大小。
结论:
索引是在更大的数据库大小和更慢的插入速度以及在大量数据中快速搜索的权衡。 在您经常将它们称为搜索条件 (WHERE) 的字段上使用索引,并删除额外的索引以优化您的数据库设计。
【讨论】: