慢速下降临时表

问题描述 投票:5回答:2

关于我正在构建的MySQL表作为报告的临时表遇到了一个有趣的问题。

我发现,如果未指定存储引擎,则DROP TEMPORARY TABLE命令将挂起最多半秒钟。

如果我将表定义为ENGINE = MEMORY,则此短句将消失。

由于我有解决此问题的方法(使用MEMORY表),所以我的问题是为什么临时表要花很长时间删除?他们默认不使用MEMORY引擎吗?它甚至不是一个很大的表,包含我的当前测试数据的数百行。

mysql performance temp-tables
2个回答
4
投票

默认情况下,临时表将在mysql配置告诉它的地方创建,通常是/ tmp或磁盘上的其他地方。您可以将此位置(甚至多个位置)设置为RAM磁盘位置,例如/ dev / shm。

希望这会有所帮助!


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请求。

© www.soinside.com 2019 - 2024. All rights reserved.