0.預備
假設我們有表 user (id,name)列
1.聯合索引是個什麼東西
我們知道,對於表的單列(如id)數據,是可以建立索引的,對於多列(id和name組合,或者,name和id組合),也可以建立索引。聯合索引,也稱之為組合索引。
先來看單列索引的邏輯結構。
由此得出索引的三個特征:索引有序+高度較低+存儲列值
聯合索引也滿足這三個特征,但這裡的邏輯圖就不畫了,而是以更直觀的方式來展現其查找邏輯,這裡應注意,聯合索引的列有前後,以id列在前、name列在後為例。
建聯合索引前的情況
建聯合索引後的情況(先按ID排序+再按Name排序)
2.建立聯合索引的語法
create index indexName on tableName(column1,column2,...,columnN),如create idx_un_userid_username on user(id,name)
聯合索引可以建立多列(列數大於2)的索引,建議列數最多不要越過3列,超過3列,應重新設計表。
3.聯合索引的好處
a:避免回表
在執行計劃中,table access by index rowid代表是回表動作。
如在user的id列建有索引,select id from user這個不用回表,直接從索引中讀取id的值,而select id,name from user中,不能返回除id列其他的值,所以必須要回表。
如果建有了id和name列的聯合索引,則可以避免回表。
另外,建立了id和name的聯合索引(id列在在前),則select id from user可以避免回表,而不用單獨建立id列的單列索引。
b:兩個單列查詢返回行較多,同時查返回行較少,聯合索引更高效。
如果select * from user where id=2 和select * from user where name='tom' 各自返回的行數比較多,而select * from user where id=2 and name='tom'返回的行數比較少,那麼這個時候使用聯合索引更加高效。
4.什麼時候該用聯合索引以及如何設計組合索引更高效
5.聯合索引在DML時候的性能分析
查詢時使用聯合索引的一個字段,如果這個字段在聯合索引中所有字段的第一個,那就會用到索引,否則就無法使用到索引。
例如聯合索引 IDX(字段A,字段B,字段C,字段D),當僅使用字段A查詢時,索引IDX就會使用到;如果僅使用字段B或字段C或字段D查詢,則索引IDX都不會用到。
這個規則在oracle和mysql數據庫中均成立。
不知道你所說的聯合索引是什麼意思,我只知道oracle常用的復合索引,也就是多字段的索引,字段重不重,其實跟你經常用到的查詢有關,通常我們創建索引是推薦創建復合索引的,如果確實有必要,需要將檢索頻率高的字段放到最前面,這樣有利於索引的使用率。