CREATE TEMPORARY TABLES 權限-- 磁盤臨時表 (默認 MyISAM/InnoDB)
CREATE TEMPORARY TABLE tmp_sales (
id INT PRIMARY KEY,
amount DECIMAL(10,2),
sale_date DATE
) ENGINE=InnoDB;
-- 內存臨時表 (HEAP/MEMORY 引擎)
CREATE TEMPORARY TABLE tmp_fast_lookup (
code CHAR(10) PRIMARY KEY,
name VARCHAR(50)
) ENGINE=MEMORY;
| 維度 | MEMORY (HEAP) | 磁盤 (InnoDB/MyISAM) |
|---|---|---|
| 存儲介質 | 內存 | 磁盤 |
| 讀寫速度 | 極快 (無 I/O) | 正常 |
| 數據持久化 | 重啟丟失 | 會話級持久 |
| 支持數據類型 | 固定長度 (無 BLOB/TEXT) | 全類型 |
| 索引類型 | HASH (默認) / BTREE | BTREE |
| 最大大小限制 | max_heap_table_size / tmp_table_size | 磁盤空間 |
| 適用場景 | 小結果集、高頻查找、中間聚合 | 大結果集、含大字段、複雜關聯 |
場景:大表 orders (5000 萬行) 需按多維度統計,直接查詢耗時 30s+。
優化:
-- 1. 抽取近 30 天熱數據到內存臨時表
CREATE TEMPORARY TABLE tmp_recent_orders ENGINE=MEMORY
SELECT order_id, user_id, amount, create_time
FROM orders
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)
AND status = 'paid';
-- 2. 創建索引加速後續 JOIN
ALTER TABLE tmp_recent_orders ADD PRIMARY KEY (order_id);
ALTER TABLE tmp_recent_orders ADD INDEX idx_user (user_id);
-- 3. 多維度統計全部在臨時表上完成
SELECT user_id, COUNT(*), SUM(amount) FROM tmp_recent_orders GROUP BY user_id;
SELECT DATE(create_time) AS dt, COUNT(*) FROM tmp_recent_orders GROUP BY dt;
-- ... 其他報表查詢
-- 4. 會話結束自動清理,無需手動 DROP
效果:報表查詢從 30s 降至 0.5s 以內。
tmp_table_size / max_heap_table_size 太小導致 MEMORY 表自動轉磁盤,性能驟降TEXT/BLOB,強制轉磁盤CREATE TEMPORARY TABLE tmp LIKE original; (不複製數據)SHOW CREATE TABLE tmp_sales;
-- 關注 ENGINE=... 行