oracle 的几种sql优化2
来源:互联网 发布:php项目绑定域名访问 编辑:程序博客网 时间:2024/06/07 03:56
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
前提:表数据很多
索引失效情况:
1:避免在索引列上使用计算。WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
低效: SELECT … FROM EMPLOYEE WHERE SAL * 12 > 25000;
高效: SELECT … FROM EMPLOYEE WHERE SAL > 25000/12
2:避免在索引列上使用IS NULL和IS NOT NULL:
对于单列索引,如果列包含空值,索引中将不存在此记录
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效:(索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0
记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
3:应尽量避免在 where 子句中使用!=或<>操作符
否则将引擎放弃使用索引而进行全表扫描。
MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,以及某些时候的LIKE。
可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如:
SELECT id FROM t WHERE col LIKE 'Mich%'; # 这个查询将使用索引,
SELECT id FROM t WHERE col LIKE '%ike'; #这个查询不会使用索引。
4:应尽量避免在 where 子句中使用 or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20
5:in 和 not in 也要慎用,否则会导致全表扫描,
如:
select id from t where num in(1,2,3)对于连续的数值,能用 between 就不要用 in 了:
Select id from t where num between 1 and 3
索引并不是越多越好,
所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
SELECT子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
前提:表数据很多
索引失效情况:
1:避免在索引列上使用计算。WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
低效: SELECT … FROM EMPLOYEE WHERE SAL * 12 > 25000;
高效: SELECT … FROM EMPLOYEE WHERE SAL > 25000/12
2:避免在索引列上使用IS NULL和IS NOT NULL:
对于单列索引,如果列包含空值,索引中将不存在此记录
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效:(索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0
记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
3:应尽量避免在 where 子句中使用!=或<>操作符
否则将引擎放弃使用索引而进行全表扫描。
MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,以及某些时候的LIKE。
可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如:
SELECT id FROM t WHERE col LIKE 'Mich%'; # 这个查询将使用索引,
SELECT id FROM t WHERE col LIKE '%ike'; #这个查询不会使用索引。
4:应尽量避免在 where 子句中使用 or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20
5:in 和 not in 也要慎用,否则会导致全表扫描,
如:
select id from t where num in(1,2,3)对于连续的数值,能用 between 就不要用 in 了:
Select id from t where num between 1 and 3
索引并不是越多越好,
所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
SELECT子句中避免使用‘*’:
在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
阅读全文
0 0
- oracle 的几种sql优化2
- oracle sql优化的几条法则
- Oracle优化SQL执行效能的几点常识
- 优化sql 语句的几种方式
- sql优化的几种方法
- Sql优化的几种方法
- sql优化的几种方法
- sql优化的几种方法
- Oracle SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- ORACLE SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- Oracle SQL的优化
- Python 的深拷贝 和 浅拷贝
- Each module has to have a unique path
- Font-Awesome 强大的字体图标
- Sublime Text 3126 Win32版本暴力破解过程
- charles抓包时设置host
- oracle 的几种sql优化2
- MATLAB调用C/C++函数的方法
- Servlet生命周期初步体验
- 资料整理
- 博客初开
- hadoop中mapreduce框架运行错误
- Spring data redis 操作list
- Spring Boot错误处理
- u-boot移植随笔(8):EEPROM移植及测试