oracle復合索引的選擇和使用

2021-09-08 22:21:48 字數 1200 閱讀 4295

宣告:雖然題目是oracle、但同樣適合mysql innodb索引

在大多數情況下、復合索引比單字段索引好

很多系統就是靠新建一些合適的復合索引、使效率大幅度提高

復合索引比單字段索引複雜、有兩個原則需把握:字首性和可選性

但是、可嘆的是、國內很多it系統開發人員沒有意識到應該優先設計復合索引

更沒有充分理解復合索引的字首性和可選性這兩個重要原則

㈠ 字首性(prefixing)

在謂詞條件中、只有將復合索引的第乙個字段作為約束條件、該復合索引才會被用上

當然、存在一種例外:index skip scan 

這個原理強調使用

比如:① 假如c1的選擇性比c2高很多、且如果有大量如下查詢:

select * from t where c1= :x and c2= :y;

select * from t where c2= :y;

這個時候(c2,c1)比(c1,c2)好

② 有id和create_time這兩個字段、乙個是主鍵、乙個是建立時間

按一般情況、建立復合索引時、需要將id放在前面、

不過、如果以create_time為查詢條件的sql比較多、而id的使用比較少

那麼、我們在設計時、應該把create_time字首

㈡ 可選性(selectivity)

概念可見

selectivity介紹

這個原理強調成本

比如:① 選擇性強的字段放在前面、可以減少 index range scan 的掃瞄成本

② 有個稅務系統、原先的復合索引是(月份,稅務機關代號,納稅人識別號,***號,收費類別)

對於這個索引、優化器並沒有選擇走索引、而是全表掃、原因如下:

● 同一月份的記錄太多了、超過1/3、全表掃成本低

● 字段順序沒有考慮可選性

新的復合索引是(納稅人識別號,月份,收費類別,稅務機關代號,***號)

㈢ 復合索引好處

① 盡可能讓乙個索引為更多的sql服務

② 復合索引是排序的、order by涉及索引欄位時、可減少排序成本

我認為呢、在為復合索引字段排序時、應該綜合考慮權衡字首性和可選性、絕不可偏袒任何一方

復合索引 復合索引順序選擇問題

color red b 注意!在較高版本的oracle中不存在下述的問題!b color 復合索引第乙個原則 字首性 prefixing color red 復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。如復合索引為 ename,job,mgr 只要...

oracle 復合索引

oracle通過復合索引優化查詢及不走索引的8種情況 建立復合索引 create index 索引名稱 on 表名 列1,列2 例子 create index name on employee emp lname,emp fname 1.復合索引 字首性 prefixing 先從例子說起.假設省,市...

DataFrame 索引和復合索引

前面按照多個條件進行分組產生的索引是復合索引 一 索引 a 獲取index df.index b 指定index df.index c 重新設定index df.reindex a b c 注意 一般不用 d 指定某一列作為index df2 df1.set index o drop false d...