面對超大表(億級行)的複雜多次查詢,反覆全表掃描極其昂貴。臨時表允許將小量結果集物質化到記憶體或磁碟,後續查詢僅掃描這個微型表,可獲數量級效能提升。
-- 磁碟臨時表(預設 MyISAM/InnoDB)
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INT NOT NULL
);
-- 記憶體臨時表(HEAP/MEMORY 引擎)
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INT NOT NULL
) ENGINE = MEMORY; -- MySQL 5.0+ 建議用 MEMORY,HEAP 為別名
DROP 臨時表並釋放空間。DROP TEMPORARY TABLE tmp_table; 釋放資源。| 特性 | 說明 |
|---|---|
| 儲存位置 | 純記憶體,讀寫極快(微秒級) |
| 索引類型 | 預設 HASH 索引(=、<=> 最優),可指定 BTREE(範圍查詢) |
| 資料型別限制 | 不支援 BLOB/TEXT,VARCHAR 實際按 CHAR 固定長度儲存 |
| 大小限制 | 受 max_heap_table_size(預設 16MB)與 tmp_table_size 共同限制,超限自動轉 MyISAM 磁碟表 |
| 並發可見性 | 僅當前連線可見,不支援事務隔離級別 |
| 持久性 | 重啟/斷電資料全失,不適合關鍵業務資料 |
臨時表較優場景:
直接查詢較優場景:
-- 原查詢:三表關聯,重複掃描 tablename2/3
SELECT t1.a, t2.a, t3.a
FROM t1, t2, t3
WHERE t1.a = t2.a AND t2.a = t3.a AND t2.c != 0;
-- 優化:先將 t2/t3 關聯結果物質化到記憶體臨時表
CREATE TEMPORARY TABLE tmp_t23 ENGINE=MEMORY
SELECT t2.a AS a2, t3.a AS a3
FROM t2, t3
WHERE t2.a = t3.a AND t2.c = 0;
-- 後續查詢僅掃描微型臨時表
SELECT t1.a, tmp.a3
FROM t1, tmp_t23 tmp
WHERE t1.a = tmp.a2;
-- 同一連線下可重複利用 tmp_t23 執行多種變體查詢
EXPLAIN SELECT ... 確認 rows,超過 max_heap_table_size 改用磁碟臨時表。ENGINE=MEMORY,磁碟表可不寫(預設)。BENCHMARK() 或 sysbench 對比臨時表與直查效能,數據說話。臨時表是 MySQL 查詢優化的「手術刀」——精準、強大,但需精準切入。掌握生命週期隔離、MEMORY 引擎特性、物質化成本模型三大核心,方能在大表查詢迷霧中斬出一條高效之路。記住:測試先行,盲目建表反而拖累效能。