即使欄位建有索引,不當的查詢寫法仍會導致掃描全表。以下為常見陷阱與改寫方案:
NOT NULL DEFAULT 'N/A' 或預設值。WHERE col = '' (空字串) 或 WHERE col = 0 (數值) 代替 NULL 判斷。CREATE INDEX idx_col_notnull ON tbl(col) WHERE col IS NOT NULL;錯誤:WHERE first_name + last_name = 'BillClinton'
正確:WHERE first_name = 'Bill' AND last_name = 'Clinton'
last_name 索引。全表掃描:WHERE last_name LIKE '%clinton%'
索引有效:WHERE last_name LIKE 'clin%' (前綴匹配)
ORDER BY col + 1, ORDER BY UPPER(col) 會觸發昂貴的 Sort 運算子。WHERE status != 1 → WHERE status IN (0, 2, 3) (若值域固定小)。UNION ALL 拆分正向範圍查詢。SARGable (Search ARGument Able):查詢條件應保持「欄位單獨出現在運算子一側」,避免對欄位施加函數、運算、隱含轉換,才能有效利用索引尋找。