MySql中的多列索引

2021-12-29 21:26:59 字數 1533 閱讀 4872

mysql中的多列索引。

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的處理方式就不一樣了,它會選擇乙個最嚴格的索引來進行檢索,可以理解為檢索能力最強的那個索引來檢索,另外乙個利用不上了,這樣效果就不如多列索引了。

mysql多列索引 MySQL的多列索引

什麼是索引?索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃瞄任何記錄...

MySql多列索引

多列索引 多列索引就是將多個列作為乙個索引,在乙個多列b tree索引中,索引列的順序意味著索引首先按照最左列進行排序,然後第二列第三列等等。所以可以按照公升序或者降序進行掃瞄,以滿足精確符合列順序的order by,group by和distinct等子句,所以,多列索引的順序至關重要,key 列...

mysql多列索引

1,資料庫每次查詢只能使用乙個索引 2,假設資料 表t a,b,c rowid 為物理位置 rowid a b c 1 1 1 1 2 2 1 13 3 2 2 14 4 1 3 3 5 2 3 12 6 1 2 5 7 2 3 9 8 1 2 2 9 1 3 6 10 2 2 11 11 2 2 ...