Oracle、Mysql中的sql性能优化

1、避免使用*

SELECT 子句中避免使用 ‘*’。

2、使用表的别名 (Alias)

当在 SQL 语句中连接多个表时 , 请使用表的别名并把别名前缀于每个 Column 上 . 这样一来 , 就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误 。

3、用 >= 替代 >

高效 :

SELECT * FROM EMP WHERE DEPTNO >=4;

低效 :

SELECT * FROM EMP WHERE DEPTNO >3;

两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 . 注意:项目中需根据实际情况而定。

4、GROUP BY

提高 GROUP BY 语句的效率 , 可以通过将不需要的记录在GROUP BY 之前过滤掉 . 下面两个查询返回相同结果但第二个明显就快了许多 。

低效 :

SELECT JOB , AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER'

高效 :

SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER'
GROUP JOB

注:避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。

5、SQL文大写

SQL语句在编译执行的时候先把SQL文转换为大写,然后再执行。所以开发过程中SQL大写,能提高执行效率。

6、IN 操作符(和exists)

用IN写出来的SQL的优点是比较容易写以及 清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的。推荐方案:EXISTS代替。子查询时,但要结合实际情况。

例如:

-- 查看 NEW YORK 的部门员工信息
--  数据多的表                         数据少的表
select * from emp where deptno in (select deptno from dept where loc = 'NEW YORK');
-- 数据少的表                          数据多的表
select * from emp where exists(select deptno from dept where emp.deptno = dept.deptno and loc = 'NEW YORK');

7、UNION操作符

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
注意:项目中根据实际情况而定,看是否需要去重。

例如:

select * from emp where empno = 7788
union
select * from emp where ename like '%A%';

select * from emp where empno = 7788
union all
select * from emp where ename like '%A%' or empno = 7788;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值