我们注意到MySQL正在报告Server Density报告的大量临时磁盘表(超过10,000)。试图更多地了解这一点。
答案 0 :(得分:15)
可以出于很多原因创建临时表。任何具有大数据集并需要排序的选择操作都将写入一个。由查询直接创建的实际临时表(TEMPORARY表类型)是基于每个连接完成的,因此如果您有一个包含50个连接的脚本,每个连接执行相同的临时表,那么它们就有50组磁盘上的临时文件。 临时表创建原因组按顺序和不同 基于磁盘的i / o通常是DBMS中最昂贵的部分,因此如果这些表用于大型数据集,则可能会将DB性能限制为I / O系统的性能。但一般来说,只是现有的,他们只是在占用磁盘空间而不是其他东西。
用于排序的临时表应在查询完成时自行清理。 'TEMPORARY'类型的临时表将在它们所连接的连接关闭时自行清理。如果您正在使用持久连接,那么TEMPORARY表将一直存在,直到您(或程序)手动DROP它们为止。
答案 1 :(得分:7)
首先阅读the answer by Marc B这就是为什么你有很多临时表的原因。 无论如何,临时表本身也不错,坏的是“磁盘上的临时表”,它很慢并且会导致大量的磁盘IO。
要防止临时表存储在磁盘上,请尝试按照以下步骤操作:
show global status like 'Created_tmp_%tables'
这两个数字。
如果百分比不是太大 - 没有什么可担心的。 答案 2 :(得分:1)
您已在表上定义了许多索引。你有没有关于索引如何工作?
只是索引是dbase中的临时表,它保留索引列的副本。插入新行时,dbase会将临时表中的新记录放在正确的位置,以便索引具有以下结果:
A)优点:
1)提高搜索速度,因为该表是基于索引字段在临时表中排序的
B)缺点:
1)减速(创建,更新,删除),因为如果需要,应该对临时表执行相同的操作。
2)由于使用临时表,数据库大小增加。
<强>结论:强>
索引是较大数据库大小和较慢插入以及快速搜索大量数据的权衡。 在经常将它们作为搜索条件(WHERE)引用的字段上使用索引,并删除额外的索引以优化数据库设计。