索引並非越多越好。設計準則只有一句:在適當的表、適當的欄位、建立適當數量的索引。以下逐層拆解。
如部門表(< 100 列),全表掃描極快,索引維護成本(DML 額外 I/O、空間)遠超查詢收益。
經驗值:常用查詢回傳列數 < 10%~15% 才值得建索引。具體做法:
FULL TABLE SCAN vs INDEX RANGE SCAN 成本。| 高價值欄位特徵 | 低價值/負價值特徵 |
|---|---|
| 高基數(唯一鍵、近似唯一) | 大量 NULL 且極少查非 NULL |
| 頻繁出現在 WHERE/JOIN/ORDER BY | 從未出現在謂詞中 |
| 外鍵欄位(連接驅動) | 頻繁大幅更新的欄位(維護成本高) |
| 範圍查詢邊界欄位 | 位圖索引適用欄位被誤建 B-tree |
某用戶表 `ID_CARD` 列建有唯一索引,上線後發現 90% 列為 NULL,業務從未按身份證查詢。決策:刪除索引,釋放空間與 DML 開銷。索引優化是持續過程,隨資料分布與業務變化定期(如半年)複盤。
V$SEGMENT_STATISTICS 中 logical reads、db block changes,若 INDEX MAINTENANCE 佔 DML 耗時 > 30%,考慮合併/刪除低選擇率索引。ALTER INDEX ... UNUSABLE 暫時停用觀察,確認無負面影響再 DROP。遵循「等值優先、範圍在後、高基數在前」原則。例:WHERE dept_id=10 AND hire_date > '2020-01-01' → 索引 (dept_id, hire_date) 而非反序。