雖然在customer_num和order_num上建有索引,但優化器仍選擇全表掃描。原因在於查詢需檢索離散的行集合,導致索引範圍掃描代價過高。
將單條複雜查詢拆分為多條簡單查詢,或使用UNION ALL合併結果集,引導優化器走索引路徑。具體改寫示例:
-- 原語句導致全表掃描
SELECT * FROM orders WHERE customer_num IN (101, 205, 309);
-- 優化:拆分為多條索引查詢
SELECT * FROM orders WHERE customer_num = 101
UNION ALL
SELECT * FROM orders WHERE customer_num = 205
UNION ALL
SELECT * FROM orders WHERE customer_num = 309;
當IN列表值較少且列有索引時,拆分查詢往往比單條IN查詢更高效。