LIKE 子句能否使用索引,關鍵在於萬用字元 (%) 位置:
LIKE 'ABC%' → 可使用索引 (INDEX RANGE SCAN)LIKE '%ABC' 或 LIKE '%ABC%' → 無法使用索引 (FULL TABLE SCAN)SELECT * FROM city WHERE name LIKE 'S%';
執行計畫:INDEX RANGE SCAN on CITY_NAME_IDX — 索引有序特性支援範圍查找。
'S%' 代表所有以 'S' 開頭的字串,在索引中形成連續範圍。-- 前端傳入 'Tai' → 後端拼接 'Tai%' WHERE city_name LIKE :input || '%'
| 方案 | 適用場景 | 實作方式 |
|---|---|---|
| 反向索引 (REVERSE) | 固定後綴查詢 (如尾碼) | CREATE INDEX idx_rev ON t(REVERSE(col)) + WHERE REVERSE(col) LIKE REVERSE('%suffix') |
| Oracle Text / ctxsys | 全文檢索、模糊搜尋 | 建立 Context 索引,使用 CONTAINS 查詢 |
| 函數索引 (SUBSTR) | 固定位置子字串 | CREATE INDEX idx_sub ON t(SUBSTR(col, -3)) + WHERE SUBSTR(col, -3) = 'abc' |
| 應用層過濾 | 小資料集、低頻查詢 | 先用索引篩選候選集,應用層再 LIKE 過濾 |
表大小 FULL SCAN 時間 INDEX RANGE SCAN 時間 加速倍數 10 萬筆 ~50 ms ~2 ms 25x 100 萬筆 ~500 ms ~5 ms 100x 1000 萬筆 ~5 秒 ~20 ms 250x 最佳實踐建議
- 業務設計階段:規劃查詢模式,優先支援前綴匹配 (如代碼、編號、前綴搜尋)。
- 索引建立:針對高頻 LIKE 查詢欄位建立 B-tree 索引。
- 避免雙向萬用字元:
LIKE '%keyword%'於大表嚴禁,改用 Oracle Text。- 統計資訊:確保欄位統計資訊最新,優化器才能正確選擇索引。
- 參數化查詢:使用綁定變數
LIKE :b1 || '%',利用游標共享。總結
LIKE 查詢索引生效鐵律:前綴固定,後綴靠邊。 設計階段即規劃前綴查詢模式,配合 B-tree 索引,可獲得數量級效能提升。後綴/中間匹配需引入反向索引、Oracle Text 或架構層面方案,切勿在大表上直接使用
LIKE '%...%'。