是否有 MySQL 引擎或技巧可以避免将如此多的临时表写入磁盘?

Eli*_*Eli 5 mysql temporary-tables

我有一个 Web 应用程序连接到运行 MySQL 的数据库。

问题在于:大量查询创建了临时表,并且涉及的许多表都具有 BLOB 字段。这意味着我在磁盘上创建了很多临时表(这里描述了这种行为https://dba.stackexchange.com/a/17679/16724),这会导致非常糟糕的性能。

有没有办法轻松解决这个问题?也许一些叉子或其他可插拔引擎?我实际上正在运行 MySQL (XtraDB) 的 Percona fork,但它与 vanilla InnoDB 存在相同的问题。坦率地说,我正在考虑改用 Postgres。

谢谢

Rol*_*DBA 4

您需要正确调整所有基于连接的设置,正如您从该链接中指出的那样。

如果你正在寻找一些快速而肮脏的东西,我有这样的东西:

早在 2012 年 11 月 30 日,我写了一篇关于将临时表映射到 RAM,甚至基于磁盘的临时表的好文章:同时创建许多 mysql 临时表是否不好?

试一试 !!!

更新 2013-01-03 22:14 美国东部时间

就 BLOB 而言,我表示哀悼。尽管如此,我有个好消息。我有一个非常快速和肮脏的特技,一旦你设置了 RAM 磁盘,你就可以做。

准备好 ???

在中设置以下值

tmp_table_size = 1K
max_heap_table_size = 1K
Run Code Online (Sandbox Code Playgroud)

这不是印刷错误。这不是一个错字。我说将tmp_table_sizemax_heap_table_size设置为 1K。您可能会说“为什么将这些值设置得这么低?”

这些值表示将临时表传输到磁盘之前允许的最大内存临时表。如果您有 RAM 磁盘,则临时表会尽快直接跳入 RAM 磁盘。正如 MySQL 文档中关于max_heap_table_size所说:

如果内存临时表超过限制,MySQL 会自动将其转换为磁盘上的 MyISAM 表。如果执行许多高级 GROUP BY 查询并且有大量内存,请增加 tmp_table_size 的值(如果需要,还可以增加 max_heap_table_size)。