“26GB堆”是什么意思?
tmp_table_size = 256M非常危险.如果多个连接决定需要tmp表,则可能会耗尽RAM.交换比降低各种设置更糟糕.
在许多情况下,Tmp表是必需的.不要害怕他们.但要检查它们.
DISTINCT,GROUP BY,ORDER BY和UNION通常需要一个tmp表.如果tmp表适合min(tmp_table_size,max_heap_table_size),那么tmp表可以使用Engine = MEMORY在RAM中.如果大于那个,则tmp表是Engine = MyISAM并且速度较慢.使用MyISAM还有其他原因,最值得注意的是选择TEXT字段. More details.
另一个常见的“错误”是盲目使用VARCHAR(255)和utf8.当使用MEMORY时,它变为765字节的CHAR,这加快了对MyISAM的转换.
你给的数字……
> Created_tmp_disk_tables几乎与Created_tmp_tables一样大 – 这意味着tmp_table_size不够大(我怀疑),或者MEMORY不能使用(我怀疑).在我的分析中,超过20%是一个危险信号.
> Created_tmp_tables /正常运行时间 – 超过20 /秒是一个红旗
> Created_tmp_disk_tables /正常运行时间 – 高于1 /秒是一个红旗
> Created_tmp_disk_tables / Questions – 超过4%是一个红旗
设置long_query_time = 1并打开SlowLog,最好打开FILE.等一天,然后在slowlog上使用pt-query-digest查找“最差”查询.如果你无法弄清楚如何改进它们,请问我们.
我不同意Rolando的两个项目:
> RAM磁盘是一个坏主意 – 最好将额外的RAM提供给其他缓存,而不是试图超越MySQL.
> OPTIMIZE TABLE很少有用,与问题无关.