索引的最左前綴原理

通常我們在建立聯合索引的時候,也就是對多個字段建立索引,相信建立過索引的同學們會發現,無論是oralce還是mysql都會讓我們選擇索引的順序,比如我們想在a,b,c三個字段上建立一個聯合索引,我們可以選擇自己想要的優先級,a、b、c,或者是b、a、c 或者是c、a、b等順序。爲什麼數據庫會讓我們選擇字段的順序呢?不都是三個字段的聯合索引麼?這裏就引出了數據庫索引的最左前綴原理。

比如:索引index1:(a,b,c)有三個字段,我們在使用sql語句來查詢的時候,會發現很多情況下不按照我們想象的來走索引。

select * from table where c = ‘1’ 這個sql語句是不會走index1索引的,select * from table where b =‘1’ and c =‘2’ 這個語句也不會走index1索引。

什麼語句會走index1索引呢?

答案是:
select * from table where a = ‘1’
select * from table where a = ‘1’ and b = ‘2’
select * from table where a = ‘1’ and b = ‘2’ and c=‘3’

我們可以發現一個共同點,就是所有走索引index1的sql語句的查詢條件裏面都帶有a字段,那麼問題來了,index1的索引的最左邊的列字段是a,是不是查詢條件中包含a就會走索引呢?

例如:select * from table where a = ‘1’ and c= ‘2’這個sql語句,按照之前的理解,包含a字段,會走索引,但是是不是所有字段都走了索引呢?

答案:不會,只會走a字段的索引,因爲聯合索引執行是有順尋的,即 a->b->c,也就是說只有走了a,纔會走b,只有走了b纔會走c;

是最左前綴原理的一部分,索引index1:(a,b,c),只會走a、a,b、a,b,c 三種類型的查詢,其實這裏說的有一點問題,a,c也走,但是隻走a字段索引,不會走c字段。

另外還有一個特殊情況說明下,select * from table where a = ‘1’ and b > ‘2’ and c=‘3’ 這種類型的也只會有a與b走索引,c不會走。

原因如下:
索引是有序的,index1索引在索引文件中的排列是有序的,首先根據a來排序,然後纔是根據b來排序,最後是根據c來排序,

像select * from table where a = ‘1’ and b > ‘2’ and c=‘3’ 這種類型的sql語句,在a、b走完索引後,c肯定是無序了,所以c就沒法走索引,數據庫會覺得還不如全表掃描c字段來的快。

發佈了104 篇原創文章 · 獲贊 34 · 訪問量 6824
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章