可索引謂詞,索引,優化器

一次sql優化的機會,被where條件,索引,優化器這三者的決定關係混淆,藉助這個問題整理以下:sql

1.概念函數

不可索引謂詞,好比<>
可索引謂詞,好比C1=5,in條也是可索引謂詞,而or條件就是不可索引謂詞
匹配到索引列的謂詞稱爲匹配謂詞
可索引謂詞是匹配謂詞的前提
不可索引謂詞能夠用作篩選謂詞
 
複合索引:主索引列+從索引列,主索引列很關係,若是where條件中的全部可索引謂詞都沒有匹配到主索引列,從索引列就不用匹配了,索引不能發揮做用,只能掃表,這就是最左原則。
當有可索引謂詞能匹配到主索引列,其它可索引謂詞再依次匹配到從索引列,這些可索引謂詞都統稱爲匹配謂詞,但最左匹配謂詞最關鍵。
 
因此,可索引謂詞用來匹配索引列的,即索引列決定了where中的可索引謂詞是否能匹配到索引,是索引的結構決定了where條件是否能使用索引, 可是通常建索引的時候,是須要逆向參考where條件中的可索引謂詞,來決定索引主從索引列。因此在使用索引的過程當中,索引決定了一切。可是在定義索引的時候,能夠說where決定了索引。
 
在使用索引的時候,where的謂詞順序是能夠被優化器按照索引的的列順序進行調整的,因此,區別索引的建立與使用的不一樣階段
 
定義索引時,特別強調可索引謂詞: 
若是where條件中匹配到了多個索引,優化器會決定使用哪些索引。一般惟一索引要優於複合索引,好比c1,c2,c3,c4的複合索引被匹配謂詞匹配到,c7的惟一索引也能夠被匹配謂詞匹配到,可能c7的惟一索引就會被優先使用,示例:
不一樣的列之間使用代數表達數一樣是不可索引的, 好比C1=C2是不可索引謂詞(C1,C2均爲數據列)
 
2.特殊的可索引謂詞: 
2.1.不必定非在where條件中出現. 好比max,min函數也是可使用索引的, 好比select  max(C1) From T. 這稱爲One-Fetch Access.
2.2.in條件
2.3.經過轉換作到可索引謂詞,好比C1 like '%tion' 能夠先將C1經過函數倒序,而後能夠利用索引, 即C1 like 'noit%'
 
 
3.where條件,索引,優化器的關係
問題:認爲優化器會自動調整where條件的順序,因此,不肯定索引的順序主從順序,即存在一個where條件決定索引仍是索引決定where條件
理解:優化器顯然只在使用階段發揮做用,優化器調整where條件也是以已經存在的索引爲依據。因此,索引決定了優化器自動調整where條件的順序。可是在建立索引建立階段,依據的是where中的可索引謂詞,注意,建立複合索引並不依賴where條件的順序。
優化器是還有一個場景是在應用索引階段,若是有多個索引知足的狀況下,選擇一個最優的索引。
 
 
 
 
 
4.示例
 
對於索引中的主索引列必須至少對應一個可索引謂詞才能使用索引的樹結構進行高效查找(不然只能對頁結點頁進行逐個掃描或者放棄索引使用表掃描)。那麼這個可索引的謂詞就稱爲匹配謂詞。若是一系列的可索引謂詞都可以匹配複合索引中從左到右連續的索引列,那麼這些可索引謂詞都是匹配謂詞。

表T1上有列C一、C二、C三、C四、C五、C六、C七、C8。其中在C1,C2,C3,C4上有索引C1234X。優化

A.查詢語句:Select * From T1 Where C1=5 And C2=4 And C3=7 And C4=2spa

該語句使用索引C1234X,匹配謂詞爲C1=五、C2=四、C3=七、C4=2。使用這些謂詞能夠直接完成定位,無需進行索引頁的逐個掃描。.net

D.查詢語句:Select * From T1 Where C2=4 And C3=7 And C1=5blog

該語句使用索引C1234X,匹配謂詞爲C1=五、C2=四、C3=7。注意,對應Where子句後面的謂詞,優化器會根據索引中列的順序進行從新排序(查詢重寫)。排序

E.查詢語句:Select * From T1 Where C1=5 And C2=4 And C4=2 And C6=10索引

該語句使用索引C1234X,匹配謂詞爲C1=五、C2=4,篩選謂詞爲C4=2,C6=10爲普通謂詞(沒有索引與之對應)。能夠看到,一旦謂詞對應的索引列不連續,那麼其後的索引列對應的謂詞就只能是篩選謂詞了。由於一旦不連續,那麼該謂詞就不能繼續使用樹結構進行定位了,只能對下層索引頁進行逐個掃描。get

F.查詢語句:Select * From T1 Where  C1=5 And C2=4 And C3>7 And C4=2it

該語句使用索引C1234X,匹配謂詞爲C1=五、C2=四、C3>7,篩選謂詞爲C4=2。一直到C3都可以使用樹結構進行定位,可是C4就不行了,由於C3>7給的只是一個範圍,該範圍內的下層索引頁只能由C4謂詞進行逐個掃描篩選了。

 

表T上有列C一、C二、C三、C四、C五、C六、C七、C8。其中在C1,C2,C3,C4上有索引C1234X;C五、C6上有索引C56X;C7上有惟一索引C7X。

用ACCESSTYPE表示訪問類型,ACCESEETYPE=I表示使用索引掃描,ACCESSTYPE=N表示使用帶In-list謂詞的索引掃描。ACCESSNAME表示使用的索引。MATCHCOLS表示匹配的索引列數。對照上面的規則,再也不進行詳細解釋了。

多個索引可用的狀況下,優化器會作優化

Select * From T Where C1=5 And C2=7 And C5=8 And C6=13

ACCESEETYPE=I  ,  ACCESSNAME=C56X  ,  MATCHCOLS=2   //至於爲何使用的是索引C56X而不是C1234X,這是由優化器的成本估算結果決定的。

Select * From T Where C1=5 And C2 in(5,6) And (C3=10 or C4=11)

ACCESEETYPE=N  ,  ACCESSNAME=C1234X  ,  MATCHCOLS=2    //"or"操做符鏈接的謂詞會被看成不可索引謂詞,所以不是匹配謂詞,可是能夠做爲篩選謂詞。

Select * From T Where C1=5 And C2=7 And C7=101

ACCESEETYPE=I  ,  ACCESSNAME=C7X  ,  MATCHCOLS=1      //一般惟一索引會優於普通索引,但也不是絕對的。

Select * From T Where C2=7 And C3=10 And C4=12 And C5=16

ACCESEETYPE=I  ,  ACCESSNAME=C1234X  ,  MATCHCOLS=0    //雖然C1234X上沒有匹配謂詞,C56X上有,可是優化器認爲使用索引C1234X更優。

 

轉自http://blog.csdn.net/idber/article/details/8182894

相關文章
相關標籤/搜索