一般情况下,这两种索引在不同的查询条件下的查询速度是不同的, 
下面简单地以"快"和"慢"来说明:第一: a b c分别建立索引时,
  查询条件:仅为其中一个字段为条件时
        如:  where a[条件]  
           或 where b[条件] 
           或 where c[条件],快
  查询条件:多个字段为条件时,慢(如:where  a[条件], b[条件] )第二: abc建立一个复合索引时,
  查询条件: where a[条件] 
          或 where a[条件], b[条件] 
          或 where a[条件], b[条件], c[条件],快
   其余条件时,慢

解决方案 »

  1.   

    TO:gdgf() 
    第一: a b c分别建立索引时,
    查询条件:多个字段为条件时,慢(如:where  a[条件], b[条件] )
    为什么慢,比不建索引还慢吗 !!第二: abc建立一个复合索引时,
    查询条件: where a[条件] 
              或 where a[条件], b[条件] 
              或 where a[条件], b[条件], c[条件],快
    这个又为什么要快,,快的原理是什么,,,那么这样where b[条件], c[条件],会快吗??
      

  2.   

    接上面的第二种,,,如果使用where b[条件], c[条件],是不是索引就没用了,,,因为索引是有abc三列组成的,,,这个索引是由a开头,所有索引页中就查找不到b,c的信息,,所以在这个复合索引中就找不到要找的查询,,最后只有使用按表扫描,,我这样理解正确吗???
      

  3.   

    补充一点
    当建立单独的a索引的时候,where a条件的执行速度为va,where a条件,b条件的速度为vab
    建立复合ab索引的时候,where a条件的执行速度为v1a,where a条件,b条件的速度为v1ab
    那么有如下比较:va>v1a
    vab<v1ab!!!仔细体会其区别,呵呵
      

  4.   

    简单来说和条件序列的顺序相一致的索引,执行速度最快。
    其次是从左最大匹配的索引,
    再次是每个条件的独立索引。
    不建索引或者不是从左开始的复合索引将得不到优化。比如条件是a=1 and b=1 and c=1,建立bc的索引的话,不会有任何作用^)^
    而同样的条件,建立a,ab,abc的索引,将使用abc索引优化;没有abc的时候,SQL就去找ab,再找a。以b,c开头的索引,是不会被使用的
      

  5.   

    Toliushui1981:
        关于查询速度能否加快,其实是查询是否符合优化条件的问题.
        楼上说得对,优化器对SQL语句优化是有条件的,因此在建立数据库时,应考滤条件查询的SQL语句而建立好相应的索引.
        建立索引并非多而全为最好,数据量很大时,若没有适当的索引,查询速度相差是非常大的.
      

  6.   

    to:iamltd(妖)
    还有两个疑问,
    1,优化器是怎样选择索引的(原则),比如有了a,ab,abc三个索引,她为什么不选择bc,或者ac
    2,在进行索引查询时候,,索引叶层有什么多,,,系统是怎样确定最终的定位的(也就索引的路径)
      

  7.   

    liushui1981() ,1,优化器是怎样选择索引的(原则),比如有了a,ab,abc三个索引,她为什么不选择bc,或者ac解答:优化器如何选择正确的索引是依靠你的SQL语句各部分的谓词、索引统计值及优化器的智力决定的!前两项你可以决定,而最后面的一项是你的老板和客户决定的!在多个索引的情况下,优化器会尽量选择与索引覆盖最接近的索引。举个例子:create table test_index
    (a int,
    b int,
    c int,
    degist varchar(20))insert into test_index
    select 1,2,3,'aa'
    union
    select 2,3,3,'aab'
    union
    select 3,4,3,'aac'
    union
    select 4,2,3,'aad'
    union
    select 5,2,3,'aae'
    如果有下面的SQL:select a,b,c
    from test_index
    where a=1 and b=4 and c=3最好的索引建立方式是:create index abc on test_index(a,b,c)为什么呢?这是因为你的select谓词中需要abc,而如果能在一个索引中找到所有abc的信息,那么优化器将选择这条索引。那么a、b、c字段在建立索引的时候的顺序有什么影响呢?注意!这一点比较容易误解!
    在上面的场景中
    create index abc on test_index(a,b,c)
    要比
    create index bac on test_index(b,a,c)好。
    为什么呢?这不是where后面的顺序决定的,而是表中的记录形态决定的。注意a的值是高基数度(重复值比率最低)的,当a作为索引的头
    会对Btree的构建非常有利。但是如果你做实验会发现,如果首先建立了abc,然后建立了bac那么在执行计划中会选择bac索引。但是将索引的建立顺序反过来,
    它就会选择abc。个人感觉这是优化器的智力问题,我们不能强求。
    如果没有abc和bac索引的话,而是建立了:create index bc on test_index(b,c)那么执行计划会首先在索引中找到bc的信息,因为bc索引中没有a的信息所以要定位到表中找到a的信息,一起返回。如果已经有了abc或者bac,优化器正常情况下不会使用bc索引。因为abc和bac已经达到了索引覆盖的目的了!只建立c的索引,情况和bc类似,你可以自己做实验观察。
    2,在进行索引查询时候,,索引叶层有什么多,,,系统是怎样确定最终的定位的(也就索引的路径)解答:如何对Btree进行遍历那是具体算法问题。你可以参考:http://www.leftworld.net/wenzhang/show/1996.html但是SQL Server会作一定的改动和优化,你可以通过它看原理。
    上面都是针对非聚集索引的情况说明的。关于索引的其他你可以参考:http://community.csdn.net/Expert/topic/4430/4430562.xml?temp=.6278192
      

  8.   

    如果没有abc和bac索引的话,而是建立了:create index bc on test_index(b,c)那么执行计划会首先在索引中找到bc的信息,因为bc索引中没有a的信息所以要定位到表中找到a的信息,一起返回。
    ------
    (因为bc索引中没有a的信息所以要定位到表中找到a的信息,一起返回)这句怎么理解,
    是不是以为要做表扫描,,bc索引无效了!!