可索引谓词,索引,优化器

一次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

相关文章
相关标签/搜索