MySQL最左匹配原則
最左匹配原則都是針對聯合索引來說的,那麼為什麼要使用聯合索引呢?
一、為什麼要使用聯合索引?
1、減少開銷。
建一個聯合索引(col1,col2,col3),實際相當於建了(col1),(col1,col2),(col1,col2,col3)三個索引。每多一個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量資料的表,使用聯合索引會大大的減少開銷!
2、覆蓋索引。
對聯合索引(col1,col2,col3),如果有如下的SQL: select col1,col2,col3 from test where col1 =1 and col2=2 那麼MySQL可以直接通過遍歷索引取得資料,而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提升效能的優化手段之一。
3、效率高。
索引列越多,通過索引篩選出的資料越少。有1000W條資料的表,有如下SQL: select from table where col1=1 and col2=2 and col3=3,假設假設每個條件可以篩選出10%的資料,如果只有單值索引,那麼通過該索引能篩選出1000W*10%=100w條資料,然後再回表從100w條資料中找到符合col2=2 and col3=3的資料,然後再排序,再分頁;如果是聯合索引,通過索引篩選出1000w*10%*10%*10%=1w,效率提升可想而知!
二、最左字首匹配原則
對於聯合索引,MySQL會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
三、最左匹配原則的原理
我們都知道索引的底層是一顆B+樹,那麼聯合索引當然還是一顆B+樹,只不過聯合索引的健值數量不是一個,而是多個。構建一顆 B+樹只能根據一個值來構建二 因此資料庫依據聯合索引最左的欄位來構建B+樹。