jackyrong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  这次继续mysql的索引问题,这里还是有不少原则可以总结一下的,大致归纳了如下面的

1 对于组合索引,如果查询条件中有最左边的一个,一般都会用到,
  比如有索引(a,b),在SQL语句中如果有select * from table where a='.....',则这个索引一般用到,是最左匹配原则,但如果是按
where b='....',则一般不会用到.

2 对于like查询,比如'%abc%',是用不到索引的,而象'abc%',是能使用索引的

3 如果对于估计使用索引比全表扫描慢,则不用索引,比如一个表中,要查询的记录占了表的绝大部分,则不使用索引的.
4 用or 分开的条件,如果or前条件的列有索引,但后面的列没索引,那么涉及的索引不会被用到.
   比如 where a=123 or b=456,如果只有a是索引列,但b不是的话,则不会用到索引.
5 如果列类型是字符串,那么要记得在where条件中把字符常量用引号括起来,否则即使是索引列也不会用到.
比如where name=294(如果name是字符型的话,294要用括号括起来)

6 注意在SQL中,有索引字段的语句中,尽量少用表达式函数计算等,比如
   WHERE mycol < 4 / 2
WHERE mycol * 2 < 4

  对于第一行,优化器把表达式4/2简化为2,接着使用mycol上的索引来快速地查找小于2的值。对于第二个表达式,MySQL必须检索出每个数据行的mycol值,乘以2,接着把结果与4进行比较。在这种情况下,不会使用索引。数据列中的每个值都必须被检索到,这样才能计算出比较表达式左边的值。

  又比如
   希望找到一些与今天相隔固定的几天的日期的记录。表达这种类型的比较有很多种方法--它们的效率并不同。下面就有三种:

  WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff
WHERE TO_DAYS(date_col) < cutoff + TO_DAYS(CURDATE())
WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY)

  对于第一行,不会用到索引,因为每个数据行都必须检索以计算出TO_DAYS(date_col)的值。第二行要好一些。Cutoff和TO_DAYS(CURDATE())都是常量,因此在处理查询之前,比较表达式的右边可以被优化器一次性计算出来,而不需要每个数据行都计算一次。但是date_col列仍然出现在函数调用中,它阻止了索引的使用。第三行是这几个中最好的。同样,在执行查询之前,比较表达式的右边可以作为常量一次性计算出来,但是现在它的值是一个日期。这个值可以直接与date_col值进行比较,再也不需要转换成天数了。在这种情况下,会使用索引。
 
9 order by语句
    下列语句可以使用索引
     select * from t1 order by key1,key2.....
      select * from t1 where key1=1 order by k1 desc,k2 desc
     但下面的不行,因为混杂了在一起
     select * from t1 order by key1 desc,key2 asc;
select * from t1 order by key1,key2
 


posted on 2008-06-28 09:30  jackyrong的世界  阅读(299)  评论(0编辑  收藏  举报