一、組合索引的適用場景
適用在單獨查詢返回記錄很多,組合查詢後忽然返回記錄很少的情況:
比如where 學歷=碩士以上 返回不少的記錄
比如where 職業=收銀員 同樣返回不少的記錄
於是無論哪個條件查詢做索引,都不合適。
可是,如果學歷爲碩士以上,同時職業又是收銀員的,返回的就少之又少了。
於是聯合索引就可以這麼開始建了。
組合索引有時可以避免回表;
建立組合索引的列不易過多,一般不超過3個字段;
二、組合索引的順序問題
要考慮單獨的前綴查詢情況(否則單獨前綴查詢的索引不能生效或者只能用到跳躍索引), 比如你在建id,object_type的聯合索引時,要看考慮是單獨where id=xxx查詢的多,還是單獨where object_type查詢的多。
僅等值無範圍查詢時,組合索引順序不影響性能(比如where col1=xxx and col2=xxx,無論COL1+COL2組合還是COL2+COL1組合,效果是一樣的)
組合索引最佳順序一般是將列等值查詢的列置前。(測試組合索引在條件是不等的情況下的情況,條件經常是不等的,要放在後面,讓等值的在前面),如下:
create index idx_id_type on t(object_id,object_type);
create index idx_type_id on t(object_type,object_id);
select /*+index(t,idx_id_type)*/ * from t where object_id>=20 and object_id<2000 and object_type='TABLE'; //不推薦
select /*+index(t,idx_type_id)*/ * from t where object_id>=20 and object_id<2000 and object_type='TABLE'; //推薦