OR 條件常導致優化器放棄索引、退化為全表掃描。本文示範將 OR 拆分為 UNION ALL,使各分支各自命中索引,消除順序存取,大幅提升效能。
SELECT * FROM orders
WHERE (customer_num=104 AND order_num>1001) OR order_num=1008;
雖 customer_num、order_num 均有索引,優化器仍選全表掃描 (無法合併兩個索引範圍)。
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION ALL
SELECT * FROM orders WHERE order_num=1008;
INDEX (customer_num, order_num) 範圍掃描。INDEX (order_num) 等值查找。UNION ALL 不去重,效能優於 UNION (去重需排序/臨時表)。3 層巢狀查詢,每層 1000 行 → 10 億行掃描。核心解法:**連接欄位加索引** (如學號)。