針對 MySQL 效能優化,三大高收益、低成本的重構技巧:選取最適用欄位屬性、用 JOIN 取代子查詢、用 UNION 取代手動臨時表。附原理分析、對比 SQL 與效能說明。
CHAR(6) 而非 VARCHAR(255)。MEDIUMINT (3 字節) 代替 BIGINT (8 字節),節省 60% 空間。NOT NULL 就 NOT NULL,查詢時省去 NULL 判斷。ENUM:內部存數值,比較速度快於字串,空間極小。
DELETE FROM customerinfo
WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);
-- 或
SELECT * FROM customerinfo
WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);
tmp_table_size),效能急劇下降。
SELECT c.*
FROM customerinfo c
LEFT JOIN salesinfo s ON c.CustomerID = s.CustomerID
WHERE s.CustomerID IS NULL;
salesinfo.CustomerID 索引效能極佳。NOT IN 含 NULL 值時語義陷阱(返回空集),LEFT JOIN ... IS NULL 無此問題。
CREATE TEMPORARY TABLE tmp AS SELECT Name, Phone FROM client;
INSERT INTO tmp SELECT Name, BirthDate FROM author;
INSERT INTO tmp SELECT Name, Supplier FROM product;
SELECT * FROM tmp;
DROP TEMPORARY TABLE tmp;
SELECT Name, Phone FROM client
UNION
SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product;
UNION 自動去重(UNION ALL 保留重複、更快)。SELECT 欄位數、順序、類型必須一致。| 技巧 | 影響面 | 典型提升 |
|---|---|---|
| 精簡欄位屬性 | 儲存空間、索引大小、快取命中、全表掃描速度 | 20-50% 空間節省,查詢加速 10-30% |
| JOIN 替代子查詢 | 臨時表建立/掃描/寫磁碟、記憶體壓力 | 大表場景 10-100 倍 |
| UNION 替代臨時表 | 多語句往返、顯式建表/刪表、鎖競爭 | 簡化邏輯、減少鎖持有時間 |
三大絕招無需架構變更、無需新工具,純 SQL 重構即可見效。建議納入 Code Review 清單:子查詢能否 JOIN?臨時表能否 UNION?欄位類型是否過大?持續微優化,積少成多。