面對大表複雜查詢,將所需子集先導入臨時表,再在臨時表上操作,往往能大幅降低 I/O 與 CPU 開銷。MySQL 臨時表具有會話級隔離、自動清理、支援索引等特性,是複雜報表、ETL、多步驟邏輯的利器。
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL );
CREATE TEMPORARY TABLE tmp_table SELECT * FROM large_table WHERE create_time > '2023-01-01';
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) ENGINE = MEMORY;
tmp_table_size/max_heap_table_size 限制,超限自動轉 MyISAM 磁碟表DROP TEMPORARY TABLE tmp_table;CREATE PROCEDURE sp_test_tt(IN i_chars VARCHAR(50), OUT o_counts BIGINT)
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable (
objChk VARCHAR(255) PRIMARY KEY,
ModelName VARCHAR(50),
Operator VARCHAR(500),
PModelName VARCHAR(50)
) ENGINE = MEMORY;
TRUNCATE TABLE tmpTable; -- 每次調用前清空
INSERT INTO tmpTable VALUES (i_chars, i_chars, i_chars, i_chars);
INSERT INTO tmpTable VALUES (i_chars, i_chars, i_chars, i_chars);
SELECT * FROM tmpTable; -- 結果集 1
SELECT COUNT(*) INTO o_counts FROM tmpTable; -- 輸出參數
END;
CREATE PROCEDURE sp_test_tt(IN i_chars VARCHAR(50), OUT o_counts BIGINT)
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable (
objChk VARCHAR(255) PRIMARY KEY,
ModelName VARCHAR(50),
Operator VARCHAR(500),
PModelName VARCHAR(50)
) ENGINE = MEMORY;
BEGIN
DECLARE EXIT HANDLER FOR SQLWARNING, NOT FOUND, SQLEXCEPTION SET o_counts = -1;
INSERT INTO tmpTable VALUES (i_chars, i_chars, i_chars, i_chars);
SELECT * FROM tmpTable;
SELECT COUNT(*) INTO o_counts FROM tmpTable;
END;
TRUNCATE TABLE tmpTable; -- 正常/異常退出均執行清理
END;
關鍵點: TRUNCATE 放在 END 之後,即使 Handler 內拋出異常,外層流程仍會執行清理。結果集已返回客戶端,不受後續 TRUNCATE 影響(經 Java 驗證)。
| 場景 | 建議 | 理由 |
|---|---|---|
| 大表複雜查詢 | 先篩選到臨時表,再 JOIN/聚合 | 縮小掃描範圍,利用臨時表索引 |
| 多步驟 ETL | 中間結果落臨時表 | 避免重複掃描大表,邏輯清晰 |
| 高頻存儲過程 | IF NOT EXISTS + TRUNCATE 避免重複創建開銷 | 連接池環境下顯著降低 CPU |
| 需要索引加速 | 臨時表定義 PK/INDEX | 後續 JOIN/WHERE 可用索引 |
| 數據量較大 | 慎用 MEMORY 引擎,防超限轉磁碟 | 磁碟臨時表性能不如預期 |
TRUNCATECREATE TEMPORARY TABLES 權限| 特性 | 臨時表 | 子查詢 | CTE (WITH) |
|---|---|---|---|
| 可重用性 | 高(會話級) | 低(單語句) | 中(單語句多引用) |
| 可建索引 | 是 | 否 | 否 |
| 統計信息 | 無(臨時) | 依賴外部表 | 依賴外部表 |
| 適用場景 | 多步驟、大中間結果 | 簡單嵌套 | 遞歸、鏈路查詢、單語句復用 |