ORDER BY/GROUP BY 列有索引可避免 Sort 操作。| 場景 | 典型列 | 索引類型建議 |
|---|---|---|
| 高頻 WHERE 條件列 | 訂單號、用戶 ID、手機號、身份證 | B-Tree (高基數) / 位圖 (低基數、數倉) |
| 主鍵列 | PK 定義列 | 唯一 B-Tree (主鍵約束自動創建) |
| 外鍵/關聯列 | FK 列、JOIN ON 列 | B-Tree (加速 NLJ/HJ 構建) |
| 範圍查詢列 | 創建時間、交易金額、日期 | B-Tree (有序特性天然支持範圍) |
| 排序/分組列 | ORDER BY col, GROUP BY col | B-Tree (避免 SORT ORDER BY) |
| 覆蓋索引候選 | SELECT 列集合較小、高頻 | 複合索引包含所有 SELECT 列 (Index Only Scan) |
CLOB/BLOB/LONG/RAW — 數據量大、不可直接索引 (需 Context/全文索引)。| 路徑 | 語法/方式 | 特點 | 適用場景 |
|---|---|---|---|
| 直接創建 | CREATE [UNIQUE|BITMAP] INDEX idx_name ON tbl(col1, col2) [TABLESPACE ts] [COMPRESS n] [ONLINE] [PARALLEL n]; | 最靈活:可指定類型、唯一性、複合列順序、壓縮、在線構建、並行度 | 精細調優、覆蓋索引、函數索引、域索引 |
| 約束間接創建 | ALTER TABLE tbl ADD CONSTRAINT pk_name PRIMARY KEY (col) USING INDEX (CREATE INDEX ...);ALTER TABLE tbl ADD CONSTRAINT uk_name UNIQUE (col); | PK → 唯一聚簇索引 (IOT) 或唯一非聚簇;UK → 唯一非聚簇。類型固定,定制度低。 | 標準化建模、主鍵/唯一約束同步建立 |
優先級:約束創建的索引 **覆蓋** 同列同序的標準索引 (約束索引優先級更高)。
CREATE INDEX idx_order_cust_dt ON orders(cust_id, order_dt, amount); — cust_id 高選擇性在前,order_dt 範圍在中,amount 覆蓋在後WHERE cust_id=? / WHERE cust_id=? AND order_dt>? / WHERE cust_id=? ORDER BY order_dt),減少索引總數PK_表, UK_表_列, IDX_表_列1_列2, BIX_表_列 (位圖)。DBA_INDEXES + V$OBJECT_USAGE (MONITORING USAGE) 識別長期未用索引 → 刪除。CLUSTERING_FACTOR ≈ NUM_ROWS (好) vs ≈ BLOCKS (壞) → 考慮重建表/索引或調整 PCTFREE。ONLINE,避免 DML 阻塞。COMPRESS n (n=前導重複列數) 節省空間、提升緩存命中。INVISIBLE 測試新索引影響,驗證無負面再 VISIBLE。索引是 **「查詢加速器」與「寫入負擔」的雙刃劍**。
**黃金法則**:
1. **只為高頻、高選擇性、關聯、排序列建索引**
2. **複合索引列順序 = 選擇性遞減 + 業務查詢模式覆蓋**
3. **定期用 MONITORING USAGE 清理僵尸索引**
4. **約束管理主鍵/唯一,直接創建管理業務加速索引**
將索引視為「稀缺資源」精細化管理,才能在讀寫平衡點上持續交付性能。