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";
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";
相关文章推荐
- 采用optimizer_index_cost_adj优化SQL语句
- SQL语句的优化方法
- ORACLE SQL语句优化技术分析
- SQL语句优化技术分析
- SQL语句的自动优化
- SQL语句优化
- SQL语句性能优化--LECCO SQL Expert
- 【收藏】SQL语句优化技术分析
- SQL语句优化技术分析
- oralce数据库中的SQL语句的优化
- 如何用外部程序优化SQL语句中的IN和EXISTS
- SQL语句优化技术分析
- ORACLE SQL语句优化技术分析(原创)
- SQL语句优化技术分析
- ORACLE SQL语句优化技术分析
- SQL语句优化
- 一个sql语句的优化
- 优化数据库的思想及SQL语句优化的原则
- SQL语句优化技术分析(1)
- 一个sql语句的优化及oracle翻页