宣告:雖然題目是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...