聯合索引最左匹配原則
如果有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上建立了索引;
如果有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;
例如:
組合索引(a,b)
explain select * from test where a=1 and b=1;
explain select * from test where b=1 and a=1;
在查詢解釋中顯示都用到了索引,是因為:
mysql在處理where條件是,優化查詢條件一批匹配索引的位置,直到遇到範圍查詢(>、<、between、like)就停止匹配,也就是說mysql會自動優化查詢條件來匹配索引,來滿足使用索引的條件。
上述例子中建立(a,b)索引,也就相當於建立了索引a 和索引 ab(只能從左到右順序組合建立)。這樣在where條件中 將使用最頻繁的欄位寫在前面,也能匹配上。
但。還有些例子如果where條件中只有 where b=1會不會用到複合索引?
答案是會用到。原理是:
根據mysql的原理,只要是索引或者滿足索引的一部分就可以使用index方式掃描(explain下的type型別),mysql都可能會用到這個複合索引,但有一個致命的缺點!效率不高。mysql會從索引中的第一個資料一個個的查詢到最後一個數據,直到找到符合判斷條件的某個索引。
注意:複合索引 什麼情況下才能真正被呼叫?最左側的索引欄位先進行了等值匹配,之後的欄位變得有序時,才會用到這個複合索引。簡單說。就是複合索引的欄位最好有有序的才會確保用到它。
總結
聯合索引的最左原則就是建立索引KEY union_index (a,b,c)時,等於建立了(a)、(a,b)、(a,b,c)三個索引,從形式上看就是索引向左側聚集,所以叫做最左原則,因此最常用的條件應該放到聯合索引的組左側。
利用聯合索引加速查詢時,聯合查詢條件符合“交換律”,也就是where a = 1 and b = 1 等價於 where b = 1 and a = 1,這兩種寫法都能利用索引KEY union_index (a,b,c)。