不要迷信「UNION ALL 永遠優於 OR/IN」。實際性能取決於:是否命中索引、掃描行數、執行計劃類型。三者在合理使用索引時性能接近;濫用 UNION ALL 反而可能導致多次全表掃描,效果適得其反。
BT (ID PK, VName VARCHAR(20)),InnoDB。-- 查詢 ID IN (98, 85220, 9888589) SELECT * FROM BT WHERE ID IN (...); SELECT * FROM BT WHERE ID = 98 UNION ALL SELECT * FROM BT WHERE ID = 85220 ...
type=ref(非唯一索引掃描),OR/IN 顯示 type=range(索引範圍掃描)。ref 理論優於 range,但單次範圍掃描 vs 多次 ref 掃描,實際耗時持平。-- 查詢 VName IN ('M98', 'M85220', 'M9888589')
SELECT * FROM BT WHERE VName IN (...);
SELECT * FROM BT WHERE VName = 'M98' UNION ALL ...
rows=966萬),UNION ALL 執行 三次全表掃描(rows=966萬 × 3)。type=ALL 一致,但掃描行數決定性能。SELECT * FROM BT WHERE VName = 'M98' OR ID = 9888589; SELECT * FROM BT WHERE VName = 'M98' UNION ALL SELECT * FROM BT WHERE ID = 9888589;
ref/range。
