您的位置:首页 > 数据库

sql语句优化

2016-09-30 12:01 197 查看
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by设计的列上建立索引

2、避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描

(单列索引,索引不记录空值;多列索引,只记录某一列不为空的记录)

3、避免在where子句中使用!=或<>,否则将导致引擎放弃使用

(可以只用>=、<=)

4、避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引(可用union all代替or)

5、如果在where子句中使用参数,也会导致全表扫描。因为sql只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择

推迟到运行时,因而无法作为索引选择的输入项

(可改为强制查询使用索引select id from t with(index(索引名)) where num=@num)

6、避免在where子句中对字段进行表达式操作,将导致引擎放弃使用索引而进行全表扫描

(select id from t where num/2 = 100)

7、避免在where子句对字段进行函数操作,将导致引擎放弃使用索引

8、当索引列有大量数据重复时,sql查询可能不会去利用索引

9、避免复杂的多表关联

10、查询时不要用*,这个工作是通过查询数据字典完成的,使用别名能够加快解析速度

11、exists替换distinct

12、尽量用UNION-ALL替换UNION

13、在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使数据库引擎 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能

14、使用前置通配符,索引将不被采用

15、在索引列上使用NOT和函数,就让ORACLE停止索引

聚集索引 :表的物理存储顺序与指针(即逻辑)顺序相同

非聚集索引 :物理与逻辑顺序不同

因为一个表只能有一个物理顺序,所以,聚集索引的个数最多只能是1.

唯一索引 是给所做的索引增加了唯一性的约束,添加,修改索引列中数据时,不允许出现重复值.它可以是聚集索引,也可以是非聚集的,就看你如何定义

主键索引 是把主键列定义为索引,主键具有唯一性,所以主键索引是唯一索引的一种特殊形式

16、避免索引列出现类型自动转换

17、oracle采用自下而上的顺序解析where子句,当在where子句中有多个表联接时,where子句中排在最后的表应当是返回行数可能最少的表,有过滤条件的子句应放在where子句中的最后

18、避免使用having子句,having只会在检索所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作

19、not exists替代not in,not in对子查询的表执行全表遍历,使用not exists可以有效地利用索引



语句1.select dname,deptno from dept where 
deptno not in(select deptno from emp)
语句2.select dname,deptno from dept where
not exists
(select deptno from emp where dept.deptno = emp.deptno)


20、在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边

21、组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。
如果有一个组合索引(col_a,col_b,col_c)

下面的情况都会用到这个索引:
col_a = "some value";
col_a = "some value" and col_b = "some value";
col_a = "some value" and col_b = "some value" and col_c = "some value";
col_b = "some value" and col_a = "some value" and col_c = "some value";

对于最后一条语句,mysql会自动优化成第三条的样子~~。

下面的情况就不会用到索引:
col_b = "aaaaaa";
col_b = "aaaa" and col_c = "cccccc";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: