建立的索引后, select 语句中,where条件和排序条件必须完全和索引一样,
索引才能真正起到作用,并且排序条件的先后顺序必须和索引一致.
where的 字段必须处于索引最开始的位置,例如:
表t 建立唯一索引,索引的字段依序为:abcd,并且都为降序
select a from t where a=1 and b = 1 order by c desc, d desc
以上语句能最佳使用到索引,下面语句使用索引,效果减弱:
select a from t where a=1 and b = 1 order by d desc, c desc
排序中c d字段前后交换后,索引还是用到了,但查询器会多进行一次排序.
select a from t where a=1 and b = 1 order by c , d desc
c字段排序改为正序,索引会用到,但会增加一次排序的工作,在索引中扫描的行数会增大一些
select a from t where a=1 order by c desc, d desc
条件中没有使用b字段,用不到索引,会扫描表
select a from t where b=1 and a = 1 order by c desc, d desc
条件中,ab字段顺序前后交换,对利用索引没有任何影响.
select a, E from t where a=1 and b = 1 order by c desc, d desc
结果字段中选择了E,E不是索引中的字段,查询器会扫描索引后,再次到表数据中去获取该字段的值
当两个表连接时,用nested-loop join连接2个表效率是最高的,当扫描的第一个表的行过多时,
可能查询优化器就不会用nested-loop join连接,会
自动采用Merge Join或哈希连接,会导致扫描第二个表时增加很多的行,效率更低,
并且还可能会影响第一个表排列好的结果记录的顺序,
因此应该根据最终的查询需求,将第一个表扫描的结果进行筛选,以尽可能小的结果集和其他表连接.