將「大表連接 + 過濾 + 排序」的昂貴操作**物質化**為一張**已排序的小臨時表**,後續高頻查詢直接掃描臨時表,極大減少 I/O 與 CPU。
原始查詢:查詢余額大於 0 且郵編 > '98000' 的客戶,按名稱排序,需反覆執行。
SELECT c.name, r.balance, ... FROM customer c, receivable r WHERE c.customer_id = r.customer_id AND r.balance > 0 AND c.postcode > '98000' ORDER BY c.name;
CREATE TEMPORARY TABLE cust_with_balance AS SELECT c.name, r.balance, c.postcode, ... FROM customer c, receivable r WHERE c.customer_id = r.customer_id AND r.balance > 0 ORDER BY c.name;
SELECT * FROM cust_with_balance WHERE postcode > '98000';
CREATE TEMPORARY TABLE ... ENGINE=MEMORY:極速讀取,但重啟丟失、大小受 max_heap_table_size 限制。REPLACE INTO tmp SELECT ... 刷新準實時數據。INDEX(postcode) 於臨時表進一步加速篩選。