【數據庫】聯合索引是什麼?爲什麼要用它?用它時要注意什麼?

聯合索引是什麼
對多個字段同時建立的索引(有順序,ABC,ACB是完全不同的兩種聯合索引。)

爲什麼要用
以聯合索引(a,b,c)爲例

建立這樣的索引相當於建立了索引a、ab、abc三個索引。一個索引頂三個索引當然是好事,畢竟每多一個索引,都會增加寫操作的開銷和磁盤空間的開銷。
覆蓋(動詞)索引。同樣的有聯合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=xxx and b = xxx。那麼MySQL可以直接通過遍歷索引取得數據,而無需讀表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提升性能的優化手段之一
索引列越多,通過索引篩選出的數據越少。有1000W條數據的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假設每個條件可以篩選出10%的數據,如果只有單值索引,那麼通過該索引能篩選出1000W*10%=100w 條數據,然後再回表從100w條數據中找到符合b=2 and c= 3的數據,然後再排序,再分頁;如果是複合索引,通過索引篩選出1000w *10% *10% *10%=1w,然後再排序、分頁,哪個更高效,一眼便知
使用時注意什麼
單個索引需要注意的事項,組合索引全部通用。比如索引列不要參與計算啊、or的兩側要麼都索引列,要麼都不是索引列啊、模糊匹配的時候%不要在頭部啦等等
最左匹配原則。(A,B,C) 這樣3列,mysql會首先匹配A,然後再B,C.
如果用(B,C)這樣的數據來檢索的話,就會找不到A使得索引失效。如果使用(A,C)這樣的數據來檢索的話,就會先找到所有A的值然後匹配C,此時聯合索引是失效的。

把最常用的,篩選數據最多的字段放在左側。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章