MySQL 在查詢處理過程中,為了完成某些操作(排序、分組、去重等),會自動建立內部臨時表。使用者無法直接控制其建立時機與引擎選擇。
UNION 查詢TEMPTABLE 演算法的視圖 / UNION 中的視圖JOIN 中 ORDER BY 或 GROUP BY 使用非驅動表欄位DISTINCT + ORDER BYSQL_SMALL_RESULT 提示FROM 子查詢(衍生表)UPDATEGROUP_CONCAT()、COUNT(DISTINCT ...) 評估TEXT / BLOB 欄位GROUP BY / DISTINCT 欄位長度 > 512 字元(或 512 位元組二進位)SELECT/UNION 輸出欄位最大長度 > 512SHOW COLUMNS、DESCRIBE 等輸出含 BLOB| 參數 | 說明 | 建議 |
|---|---|---|
| tmp_table_size | 系統建立記憶體臨時表最大值 | 64M-256M,視記憶體而定 |
| max_heap_table_size | 使用者建立 MEMORY 表最大值 | 與 tmp_table_size 保持一致 |
實際記憶體臨時表上限 = MIN(tmp_table_size, max_heap_table_size)
default_tmp_storage_engine(5.6.3+):CREATE TEMPORARY TABLE 使用者建立的臨時表引擎,預設 MEMORYinternal_tmp_disk_storage_engine(5.7.5+):內部磁碟臨時表引擎,可選 InnoDB/MyISAM,預設 MyISAM切勿混淆兩者:前者控制使用者建立的臨時表,後者控制伺服器內部產生的磁碟臨時表。
ORDER BY / GROUP BY 欄位建立索引,避免 filesort 與臨時表tmp_table_size / max_heap_table_size,但避免 OOMinternal_tmp_disk_storage_engine=InnoDB 獲得事務保護與更好並發DISTINCT、ORDER BY NULL 抑制隱含排序SET default_tmp_storage_engine = MyISAM;
CREATE TEMPORARY TABLE t1 (id INT);
SHOW CREATE TABLE t1\G -- Engine=MyISAM
SET default_tmp_storage_engine = MEMORY;
CREATE TEMPORARY TABLE t2 (id INT);
SHOW CREATE TABLE t2\G -- Engine=MEMORY