关于我正在构建的MySQL表作为报告的临时表遇到了一个有趣的问题。
我发现,如果未指定存储引擎,则DROP TEMPORARY TABLE命令将挂起最多半秒钟。
如果我将表定义为ENGINE = MEMORY,则此短句将消失。
由于我有解决此问题的方法(使用MEMORY表),所以我的问题是为什么临时表要花很长时间删除?他们默认不使用MEMORY引擎吗?它甚至不是一个很大的表,包含我的当前测试数据的数百行。
默认情况下,临时表将在mysql配置告诉它的地方创建,通常是/ tmp或磁盘上的其他地方。您可以将此位置(甚至多个位置)设置为RAM磁盘位置,例如/ dev / shm。
希望这会有所帮助!
如果临时文件是使用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请求。