CREATE TABLE 權限,只要有 CREATE TEMPORARY TABLES 權限即可。CREATE TEMPORARY TABLE tmp_user_stats (
user_id BIGINT NOT NULL,
login_cnt INT NOT NULL DEFAULT 0,
last_login DATETIME,
PRIMARY KEY (user_id)
) ENGINE=InnoDB; -- 支持事務、行鎖、外鍵
CREATE TEMPORARY TABLE tmp_lookup (
code CHAR(10) NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL
) ENGINE=MEMORY; -- 數據全在內存,哈希索引默認,極快
HEAP 限制:
BLOB/TEXT、VARCHAR 超過定長(實際存固定長度)。AUTO_INCREMENT(5.6+ 已支持)。max_heap_table_size、tmp_table_size 限制(取較小者,默認 16MB),超限自動轉磁盤 MyISAM。-- 原查詢:多次 JOIN 同一大表
SELECT ... FROM big_table JOIN dim1 ...;
SELECT ... FROM big_table JOIN dim2 ...;
-- 優化:先篩選核心鍵值到臨時表
CREATE TEMPORARY TABLE tmp_core_keys AS
SELECT id FROM big_table WHERE create_time > '2024-01-01' AND status=1;
-- 後續多次 JOIN tmp_core_keys(極小、有索引、內存命中)
SELECT ... FROM tmp_core_keys t JOIN dim1 ON t.id = dim1.id;
SELECT ... FROM tmp_core_keys t JOIN dim2 ON t.id = dim2.id;
CREATE TEMPORARY TABLE tmp_step1 AS
SELECT user_id, COUNT(*) AS cnt FROM events WHERE dt >= '2024-01-01' GROUP BY user_id;
CREATE TEMPORARY TABLE tmp_step2 AS
SELECT u.*, s.cnt FROM users u JOIN tmp_step1 s ON u.id = s.user_id WHERE s.cnt > 10;
-- 最終報表查詢 tmp_step2,邏輯清晰、易調試、避免巨大單句 SQL
-- 應用層首次查詢寫入臨時表
CREATE TEMPORARY TABLE tmp_page_cache ENGINE=MEMORY AS
SELECT id, title, summary FROM articles WHERE category='tech' ORDER BY id DESC;
-- 後續分頁直接讀臨時表
SELECT * FROM tmp_page_cache LIMIT 20 OFFSET 40;
SET SESSION tmp_table_size = 256M; SET SESSION max_heap_table_size = 256M; 避免隱式轉磁盤。CREATE INDEX idx_uid ON tmp_table(user_id);。IF NOT EXISTS 不支持臨時表,需查 INFORMATION_SCHEMA.TABLES)。DROP TEMPORARY TABLE,釋放元數據鎖與空間。-- 查看當前會話臨時表
SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO; -- 5.7+
-- 查看臨時表空間使用
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE 'tmp_%';
-- 發現 Created_tmp_disk_tables 增長快 → 調大 tmp_table_size / 優化查詢避免隱式磁盤臨時表
臨時表是「查詢重構的瑞士軍刀」:將複雜邏輯拆解為多步、物化中間結果、利用索引加速後續關聯。但濫用會導致 tempdb/系統表爭用、內存壓力。原則:小結果集、多次複用、邏輯解耦 時使用,用完即銷毀。