SQL 优化

  1. 避免出现SELECT   *   FROM   table     语句,要明确查出的字段。
  2. 尽可能多的使用索引,建立复合索引。建立复合索引时列的顺序是F1,F2,F3,则在where或order   by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。 
  3. 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
  4. 应绝对避免在order   by子句中使用表达式。
  5. 如果需要从关联表读数据,关联的表一般不要超过7个。
  6. 如果在语句中有not   in(in)操作,应考虑用not   exists(exists)来重写,最好的办法是使用外连接实现。
  7. 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读操作在前面完成,数据库写操作在后面完成,避免交叉。
  8. 用union代替or,大多数情况都会快很多,但是如果or两边的是同一列,用or更快。
  9. Count(*)比count(非主键列快),count主健最快。
  10. 聚集索引和无序查找速度相当。
  11. 如果一个阶段可以被用作一个扫描参数SARG(Searchable Arguments),那么就称之为可优化的,并且可以利用索引快速获得所需数据。 

1、Like语句是否属于SARG取决于所使用的通配符的类型

如:name like ‘张%’ ,这就属于SARG 

而:name like ‘%张’ ,就不属于SARG。

2、or 会引起全表扫描

Name=’张三’ and 价格>5000 符号SARG,而:Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。 

3、非操作符、函数引起的不满足SARG形式的语句

不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:

NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。

下面就是几个不满足SARG形式的例子: 

ABS(价格)<5000 

Name like ‘%三’ 

有些表达式,如: 

WHERE 价格*2>5000 

SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为: 

WHERE 价格>2500/2 

但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。 

 

4、IN 的作用相当与OR

语句: 

Select * from table1 where tid in (2,3) 

和 

Select * from table1 where tid=2 or tid=3 

 

是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。

posted on 2012-01-10 10:23  Jimmy.x.zhou  阅读(264)  评论(0编辑  收藏  举报

导航