面對超大表多次掃描,將所需子集提取至臨時表,後續查詢在小表上執行,可大幅降低 IO 與 CPU。本文系統講解建立語法、生命週期、HEAP 引擎加速、兩種建表方式、連線隔離機制與常見誤區。
-- 方式 1:顯式定義欄位
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INT NOT NULL
);
-- 方式 2:CTAS 直接從查詢結果建表 (MySQL 3.23+)
CREATE TEMPORARY TABLE tmp_table SELECT * FROM large_table WHERE condition;
DROP TEMPORARY TABLE tmp_table (建議顯式調用,釋放當前連線資源)
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INT NOT NULL
) ENGINE = MEMORY; -- 或 TYPE=HEAP (舊語法)
| 特性 | MEMORY (HEAP) | 磁碟臨時表 (MyISAM/InnoDB) |
|---|---|---|
| 儲存位置 | 純記憶體 | 磁碟 (.MYD/.ibd) |
| 速度 | 極快 (無 IO) | 受限於磁碟 IO |
| 行格式 | **定長** (VARCHAR 存為 CHAR) | 變長 |
| 支援 BLOB/TEXT | ❌ | ✅ |
| 最大大小限制 | max_heap_table_size, tmp_table_size | 磁碟空間 |
| 超限行為 | 自動轉換為 MyISAM 磁碟表 | 無 |
關鍵配置:
max_heap_table_size(全域)、tmp_table_size(會話),取較小者為臨時表上限,預設 16MB。大臨時表需調大兩者。
DROP TEMPORARY TABLE,或啟用連線池 resetConnection 執行清理 SQL。tmp_、session_。VARCHAR(255) 實際存 2 字元也佔 255 字節。解決:臨時表欄位精確定長、或用磁碟臨時表。CREATE TEMPORARY TABLE **隱式提交** 當前事務。解決:在事務外建立臨時表。臨時表以「連線隔離、自動清理、HEAP 極速」三大特性,成為複雜報表、多步驟 ETL、大表分頁優化的戰術利器。**核心守則:顯式 DROP、命名加前綴、事務外建立、連線池清理、精確定長欄位**。掌握這五點,即可安全享受臨時表紅利。