tmp_table_size 控制記憶體內部臨時表(HEAP 表)的最大體積。複雜 GROUP BY、ORDER BY、DISTINCT、JOIN 等操作產生的中間結果若超過此值,MySQL 會自動轉換為磁碟上的 MyISAM 表,導致 IO 性能驟降。另一參數 max_heap_table_size 共同限制記憶體臨時表上限,取兩者較小值。
SHOW GLOBAL STATUS LIKE 'Created_tmp%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Created_tmp_disk_tables | 21197 | | Created_tmp_files | 58 | | Created_tmp_tables | 1771587 | +-------------------------+---------+
健康標準:Created_tmp_disk_tables / Created_tmp_tables * 100% ≤ 25%。上例僅 1.2%,屬優秀。
發現大量 Copy to tmp table 查詢,耗時長並持有讀鎖,導致 UPDATE 排隊阻塞。原配置:
tmp_table_size = 33MB max_heap_table_size = 16MB join_buffer_size = 131KB
調整策略:
join_buffer_size 調至 2MB~8MBuserid)建立索引,避免全表掃描產生臨時表SET GLOBAL tmp_table_size = 64*1024*1024; -- 即時生效 # /etc/my.cnf 永久生效 [mysqld] tmp_table_size = 200M max_heap_table_size = 200M
注意:SET GLOBAL tmp_table_size = 64M 會報錯,需用位元組數值。