聯合索引是什麼mysql
對多個字段同時創建的索引(有順序,ABC,ACB是徹底不一樣的兩種聯合索引。)
爲何要用sql
以聯合索引(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,而後再排序、分頁,哪一個更高效,一眼便知優化
使用時注意什麼.net
單個索引須要注意的事項,組合索引所有通用。好比索引列不要參與計算啊、or的兩側要麼都索引列,要麼都不是索引列啊、模糊匹配的時候%不要在頭部啦等等blog
最左匹配原則。(A,B,C) 這樣3列,mysql會首先匹配A,而後再B,C.
若是用(B,C)這樣的數據來檢索的話,就會找不到A使得索引失效。若是使用(A,C)這樣的數據來檢索的話,就會先找到全部A的值而後匹配C,此時聯合索引是失效的。排序
把最經常使用的,篩選數據最多的字段放在左側。
---------------------
做者:轉身雪人
來源:CSDN
原文:https://blog.csdn.net/nakiri_arisu/article/details/79702461
版權聲明:本文爲博主原創文章,轉載請附上博文連接!索引