處理超大表複雜查詢時,將中間結果集物化到臨時表可大幅降低重複掃描成本。本文說明 CREATE TEMPORARY TABLE 語法、HEAP/MEMORY 引擎加速、生命週期管理與效能評估要點。
-- 磁碟臨時表 (預設 MyISAM/InnoDB)
CREATE TEMPORARY TABLE tmp_stats (
id INT PRIMARY KEY,
cnt BIGINT
) ENGINE=InnoDB;
-- 記憶體臨時表 (極速,重啟消失,資料量受限於 tmp_table_size/max_heap_table_size)
CREATE TEMPORARY TABLE tmp_fast (
id INT PRIMARY KEY,
val VARCHAR(20)
) ENGINE=MEMORY;
| 特性 | 說明 |
|---|---|
| 可見性 | 僅當前 Session 可見,其他連線不可存取 |
| 生命週期 | Session 斷開自動刪除,或手動 DROP TEMPORARY TABLE |
| 同名遮蔽 | 若永久表同名,臨時表優先被引用 |
| 權限 | 需 CREATE TEMPORARY TABLES 權限 |
ENGINE=MEMORY;超過或含 BLOB/TEXT → 磁碟表。PRIMARY KEY 或 INDEX。tmp_table_size、max_heap_table_size 設為 64M~256M,超過自動轉磁碟。-- 原查詢:深分頁 OFFSET 100000 LIMIT 20 極慢
-- 優化:先取 ID 存入臨時表,再 JOIN 回主表
CREATE TEMPORARY TABLE tmp_ids (id INT PRIMARY KEY) ENGINE=MEMORY;
INSERT INTO tmp_ids SELECT id FROM huge_table WHERE cond ORDER BY id LIMIT 100020;
-- 取最後 20 筆 ID
SELECT h.* FROM huge_table h
JOIN (SELECT id FROM tmp_ids ORDER BY id DESC LIMIT 20) t USING (id);
DROP TEMPORARY TABLE tmp_ids;
臨時表是「以空間換時間」的戰術工具,善用可化解疑難慢查,濫用則適得其反。