mysql聯合索引最左原則的理解 轉

小弟我今天突然用到了一種複合索引,也叫聯合索引,查詢數據。但對其原理卻知之甚少。

從網上查了一些資料,還能理解。趕緊記下來!

如果有一個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會從索引中的第一個數據一個個的查找到最後一個數據,直到找到符合判斷條件的某個索引。

 

注意:複合索引 什麼情況下才能真正被調用?最左側的索引字段先進行了等值匹配,之後的字段變得有序時,纔會用到這個複合索引。簡單說。就是複合索引的字段最好有有序的纔會確保用到它。

索引原則

1.索引越少越好
原因:主要在修改數據時,第個索引都要進行更新,降低寫速度。
2.最窄的字段放在鍵的左邊(這個最窄應該是使用頻率的意思)
3.避免file sort排序,臨時表和表掃描.

參考資料:

https://www.cnblogs.com/forcheryl/p/7389798.html

https://www.zhihu.com/question/36996520

https://www.cnblogs.com/jamesbd/p/4333901.html

 

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