进入一个有趣的问题,我正在构建一个MySQL表作为临时表用于报告目的。
我发现如果我没有指定存储引擎,DROP TEMPORARY TABLE命令将挂起最多半秒。
如果我将我的表定义为ENGINE = MEMORY,这个短暂的挂起就会消失。
由于我有一个解决这个问题的方法(使用MEMORY表),我的问题是为什么临时表需要很长时间才能删除?默认情况下他们不使用MEMORY引擎吗?它甚至不是一个非常大的表,我的当前测试数据有几百行。
答案 0 :(得分:4)
默认情况下,临时表将在mysql配置告诉它的位置创建,通常是/ tmp或磁盘上的其他位置。您可以将此位置(甚至多个位置)设置为RAM磁盘位置,例如/ dev / shm。
希望这有帮助!
答案 1 :(得分:0)
如果临时文件是使用InnoDb引擎创建的,则可能是这种情况(如果您的默认引擎是InnoDb,并且InnoDb缓冲池很大),则DROP TEMPORARY TABLE可能需要一些时间,因为它需要扫描所有要丢弃的页面。 在对此stack overflow question的评论中提到了该问题。
还请注意,DROP(TEMPORARY)TABLE使用的LOCK可能会对您的所有服务器产生巨大影响。例如,请参见this。
在我的工作中,最近我们的服务器速度变慢,因为我们拥有80 Gb的InnoDb缓冲池,并且使用InnoDb临时表优化了一些SQL请求。 每5分钟大约有100个这样的DROP TEMPORARY TABLE请求足以产生巨大的影响。而且这个问题很难调试,因为缓慢的查询日志会告诉我们,通过其他表中的主键访问的单行的更新需要花费两秒钟的时间,并且存在大量此类更新。但是,即使大多数查询时间都花在了这些更新上,问题仍然出在真正的原因是DROP TEMPORARY TABLE请求。