MySQL 在查詢處理中自動建立的內部臨時表,優先用 MEMORY(記憶體),超限或不支援時轉 MyISAM(5.7.5+ 可選 InnoDB)。使用者無法直接控制。
UNION / UNION ALLTEMPTABLE 算法視圖 / UNION 中的視圖JOIN 時 ORDER BY/GROUP BY 用非驅動表欄位ORDER BYDISTINCT + 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 | MEMORY |
| internal_tmp_disk_storage_engine | 5.7.5+ | 伺服器內部磁碟臨時表 | MyISAM |
ORDER BY/GROUP BY 欄位加索引Created_tmp_disk_tables / Created_tmp_tables 比率internal_tmp_disk_storage_engine=InnoDB 獲得事務保護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
SHOW GLOBAL STATUS LIKE 'Created_tmp%';
-- Created_tmp_tables: 總計
-- Created_tmp_disk_tables: 落磁碟數
-- 比率 > 10% 需優化