小弟我今天忽然用到了一種複合索引,也叫聯合索引,查詢數據。但對其原理卻知之甚少。html
從網上查了一些資料,還能理解。趕忙記下來!mysql
若是有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上創建了索引;
若是有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)、(col1,col2,col3)上創建了索引;sql
例如:優化
組合索引(a,b)htm
explain select * from test where a=1 and b=1;
explain select * from test where b=1 and a=1;blog
在查詢解釋中顯示都用到了索引,是由於:排序
mysql在處理where條件是,優化查詢條件一批匹配索引的位置,直到遇到範圍查詢(>、<、between、like)就中止匹配,也就是說mysql會自動優化查詢條件來匹配索引,來知足使用索引的條件。索引
上述例子中建立(a,b)索引,也就至關於建立了索引a 和索引 ab(只能從左到右順序組合建立)。這樣在where條件中 將使用最頻繁的字段寫在前面,也能匹配上。io
但。還有些例子若是where條件中只有 where b=1會不會用到複合索引?test
答案是會用到。原理是:
根據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