最左側前綴匹配原則
在mysql中構建聯邦索引時,會遵循最左側前綴匹配的原則,即最左側優先級。當檢索數據時,它將從聯邦索引的最左邊開始匹配。例如:
在列col1、列col2和列col3上建立聯合索引。
關鍵test _ col 1 _ col2 _ col 3 on test(col 1,col 2,col 3);
聯合索引test_col1_col2_col3實際上建立了三個索引(col1)、(col1,col2)和(col2,col3)。
SELECT * FROM test WHERE col 1 = " 1 " AND clo 2 = " 2 " AND clo 4 = " 4 "
上面的查詢語句會按照最左前綴匹配原則執行,檢索時會使用索引(col1,col2)進行數據匹配。
註意
索引的字段可以按任何順序排列,例如:
SELECT * FROM test WHERE col 1 = " 1 " AND clo 2 = " 2 "
SELECT * FROM test WHERE col 2 = " 2 " AND clo 1 = " 1 "
索引(col1,col2)將在兩個查詢語句中使用。mysql創建聯合索引的規則是對聯合索引最左邊的數據即第壹個字段col1進行排序,然後在第壹個字段排序的基礎上對第二個字段col2進行排序。實際上相當於實現了order by col1 col2這樣的排序規則。
可能有人會奇怪,第二條查詢語句和最左邊的前綴不匹配:首先,可以肯定的是,兩條查詢語句都保證了索引中的col1和col2字段(col1,col2),只是順序不同,查詢條件相同,最終查詢結果肯定相同。既然結果壹樣,那麽哪個順序是最好的呢?此時,我們可以使用mysql查詢優化器explain,它將更正sql語句應該最高效執行的順序,並最終生成真正的執行計劃。
減少開支。構建壹個聯合索引(col1,col2,col3)實際上相當於構建三個索引(COL1),(COL1,COL2)和(COL1,COL2,COL3)。每個額外的索引都會增加寫入和磁盤空間的成本。對於有大量數據的表,使用聯邦索引會大大減少開銷!
覆蓋索引。對於聯合索引(col1,col2,col3),如果有以下SQL: Select COL1,COL2,col 3 from test where col 1 = 1,COL2 = 2。那麽MySQL就可以通過遍歷索引直接獲取數據,而不需要返回表,減少了大量的隨機io操作。減少io操作,尤其是隨機io,其實是dba的主要優化策略。因此,在實際應用中,重疊索引是提高性能的主要優化方法之壹。
效率高。索引列越多,索引篩選的數據就越少。壹個有1000W數據的表有如下SQL: select from table其中col 1 = 1,col 2 = 2,col 3 = 3,假設每個條件可以過濾掉10%的數據,如果只有壹個單值索引,那麽,這個索引就可以過濾掉100 w 10% = 100 w的數據,然後符合的數據如果是聯合索引,通過索引可以篩選出1000 w 10% 10% * 10% = 1W,效率提升可想而知!
擴展(的意思)
對於聯合索引(col1,col2,col3),查詢語句SELECT * FROM test其中col2 = 2我能觸發壹個索引嗎?
大部分人會說不是,其實是是的。
原因:
解釋SELECT * FROM test,其中col2 = 2
解釋SELECT * FROM test WHERE col 1 = 1;
觀察上面兩個解釋結果中的類型字段。查詢中有:
Index:這種類型表示mysql將掃描整個索引。如果要使用這種類型的索引,對這種索引沒有特殊要求。只要是索引或者聯合索引的壹部分,mysql都可能以索引類型的方式掃描。但是缺點是效率不高。mysql會從索引中的第壹個數據開始逐個查找最後壹個數據,直到找到滿足判斷條件的索引。因此,上述語句將觸發索引。
Ref:這種類型是指mysql會根據特定的算法快速找到壹個符合條件的索引,而不是對索引中的每壹個數據進行逐壹掃描判斷,也就是妳通常理解的所謂索引查詢會更快的得到數據。但是,為了實現這種搜索,需要索引。為了實現這種快速搜索算法,索引必須滿足特定的數據結構。簡單來說,索引字段的數據必須是有序的,這樣才能實現這種類型的搜索,才能使用索引。
以上是我給大家介紹的Mysql聯合索引最左匹配原則。希望對妳有幫助。如果您有任何問題,請給我留言,我會及時回復您。
兩個月後拿到n offer看我怎麽做。
面試總結:2019最全面的學習收集考試資料(含答案)。
淘寶面試回來,想和程序員們聊聊。
“見過太多大廠的面試題,其實無非就是這三種能力。”