MySql中的多列索引

聲明:本文內容來源網絡,僅供學習參考使用。

文章來源:http://www.cnblogs.com/codeAB/p/6387148.html


1)聯合索引又叫複合索引。對於複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。

2多列建索引比對每個列分別建索引更有優勢,因爲索引建立得越多就越佔磁盤空間,在更新數據的時候速度會更慢。另外建立多列索引時,順序也是需要注意的,應該將嚴格的索引放在前面,這樣篩選的力度會更大,效率更高。

3)組合索引的生效原則是  從前往後依次使用生效,如果中間某個索引沒有使用,那麼斷點前面的索引部分起作用,斷點後面的索引沒有起作用;
比如
where a=3 and b=45 and c=5 .... 這種三個索引順序使用中間沒有斷點,全部發揮作用;
where a=3 and c=5... 這種情況下b就是斷點,a發揮了效果,c沒有效果
where b=3 and c=4... 這種情況下a就是斷點,在a後面的索引都沒有發揮作用,這種寫法聯合索引沒有發揮任何效果;
where b=45 and a=3 and c=5 .... 這個跟第一個一樣,全部發揮作用,abc只要用上了就行,跟寫的順序無關

還需注意,  (a,b,c)多列索引和 (a,c,b)是不一樣的

(0) select * from mytable where a=3 and b=5 and c=4;abc三個索引都在where條件裏面用到了,而且都發揮了作用
(1) select * from mytable where c=4 and b=6 and a=3;這條語句列出來只想說明 mysql沒有那麼笨,where裏面的條件順序在查詢之前會被mysql自動優化,效果跟上一句一樣
(2) select * from mytable where a=3 and c=7;a用到索引,b沒有用,所以c是沒有用到索引效果的
(3) select * from mytable where a=3 and b>7 and c=3;a用到了,b也用到了,c沒有用到,這個地方b是範圍值,也算斷點,只不過自身用到了索引
(4) select * from mytable where b=3 and c=4;因爲a索引沒有使用,所以這裏 bc都沒有用上索引效果
(5) select * from mytable where a>4 and b=7 and c=9;a用到了 b沒有使用,c沒有使用
(6) select * from mytable where a=3 order by b;a用到了索引,b在結果排序中也用到了索引的效果,前面說了,a下面任意一段的b是排好序的
(7) select * from mytable where a=3 order by c;a用到了索引,但是這個地方c沒有發揮排序效果,因爲中間斷點了,使用 explain 可以看到 filesort
(8) select * from mytable where b=3 order by a;b沒有用到索引,排序中a也沒有發揮索引效果

4)那如果我們分別在a和b上創建兩個列索引,mysql的處理方式就不一樣了,它會選擇一個最嚴格的索引來進行檢索,可以理解爲檢索能力最強的那個索引來檢索,另外一個利用不上了,這樣效果就不如多列索引了。

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