SQL优化策略高级优化经常使用-1(The Return Of The King)

1 经常使用的优化策略

1.1    语句

1.1.1使用实际的列名

当我们查询SQL语句时。你是否觉得使用实际的列名比使用*更快呢?答案是肯定的。

为了证实这一点,感兴趣的朋友能够自己验证一下。我这里给出一个实例。

select * from user;
--时间: 0.423ms</span>
select  id,version,avatar,date_created,description,email,email_show
,enabled,first_name,last_name,last_updated,member_id,passwd
,user_real_name,user_style_id ,username,paypal_email_address
,transaction_fee_payer,pay_pal_email_address
from user;
--时间: 0.177ms


1.1.2 合理使用Having

    要理解Having的使用含义,它仅使用在对全部查询到的行数进行过滤。即。它就是一个过滤器。

不要将Having用作其他目的。

SELECT subject, count(subject) 
FROM student_details 
WHERE subject != 'Science' 
AND subject != 'Maths' 
GROUP BY subject

取代以下不合理的使用方法:

SELECT subject, count(subject) 
FROM student_details 
GROUP BY subject 
HAVING subject!= 'Vancouver' AND subject!= 'Toronto'

1.1.3    降低子查询个数

     降低子查询个数能够降低不必要的性能消耗。看看以下的这里简单实例。

SELECT name 
FROM employee 
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age) 
FROM employee_details) 
AND dept = 'Electronics'


取代以下这个语句

SELECT name 
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details) 
AND age = (SELECT MAX(age) FROM employee_details) 
AND emp_dept = 'Electronics'


     经常使用的优化提示:

1.合理的使用Exits, In ,Joinkeyword。

2.In一般会减少SQL的运行效率,当过滤标准在字查询中时,In的使用会提高运行效率;当大部分的过滤标准在住查询中时。Exits运行效率比較高。

比方以下的这个样例:

Select *from product p 
where EXISTS (select 1 from order_items o 
where o.product_id = p.product_id)


取代以下这个SQL语句

Select * from product p 
where product_id IN 
(select product_id from order_items)

 

3 使用Exits替代 Distinct。

当表之间存在一对多的关系时,使用Exits会比使用Distinct效率更高。

SELECTd.dept_id, d.dept 
FROM dept d 
WHERE EXISTS ( SELECT 'X' FROM employee e WHEREe.dept = d.dept)


取代以下的SQL语句

SELECT DISTINCT d.dept_id, d.dept 
FROM dept d,employee e 
WHERE e.dept = e.dept


4 差别UNION ALL 和UNION的差异

5 优化where查询条件。

看以下的这个样例,比較中。你会发现性能的差异。

selectid,email,first_name,last_name from user where first_name like 'Sha%'
--时间: 0.032ms</span>
<span style="font-size:18px;">selectid ,email ,first_name ,last_name from user where substr(first_name, 1, 3 ) ='Sha'
--时间: 0.035ms

实例2

SELECT product_id, product_name 
FROM product 
WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price)

取代以下的SQL语句

SELECT product_id, product_name 
FROM product 
WHERE unit_price >= MAX(unit_price) 
and unit_price <= MIN(unit_price)

1.1.4 使用 DECODE

     使用Decode函数避免扫描同样的行或者连接反复同样的表。Decode常使用在Group By的SQL语句中。

SELECT idFROM employee 
WHERE nameLIKE 'Ramesh%' 
andlocation = 'Bangalore'

代替以下SQL语句

SELECT DECODE(location,'Bangalore',id,NULL) id FROMemployee 
WHERE name LIKE 'Ramesh%'


                                                                                                                                                               

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/lcchuguo/p/4833184.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值