当前位置: 代码迷 >> SQL >> SQL优化札记
  详细解决方案

SQL优化札记

热度:63   发布时间:2016-05-05 15:15:05.0
SQL优化笔记

1.使用确定的字段替代*:

? ?使用

? SELECT id, first_name, last_name, age, subject FROM student_details;

? ? 替代

? ??SELECT * FROM student_details;

?

2.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';

?

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';

?

4.合理的使用in、exists、join:

? ?1)in一般情况下性能最差;

? ?2)当大部分的查询过滤条件在子查询中,in查询比较有效;

? ?3)当大部分的查询条件在主查询中,exists有较好的性能;

? ?使用

? ?Select * from product p?

? where EXISTS (select * from order_items o?
? where o.product_id = p.product_id)

? ?替代

? ??Select * from product p?

? where product_id IN?
? (select product_id from order_items

?

5.当关联表之间存在一对多关系时,可以使用exists替代distinct:

? ?使用

? ?SELECT d.dept_id, d.dept?

? FROM dept d?
? WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);

? ?替代

? ?SELECT DISTINCT d.dept_id, d.dept?

? FROM dept d,employee e?
? WHERE e.dept = e.dept;

6.使用union all 替代 union:

? ?使用

? ?SELECT id, first_name?

? FROM student_details_class10?
? UNION ALL?
? SELECT id, first_name?
? FROM sports_team;

? ? 替代

? ??SELECT id, first_name, subject?

? FROM student_details_class10?
? UNION?
? SELECT id, first_name?
? FROM sports_team;

7.注意where条件语句的选择

? ?1)避免反相匹配符的选择,如!=、not in等;

? ?2)尽量不要使用全模糊,即'%condition%';

?

8.使用exists替代count判断记录是否存在。

?

9.使用%替代substr

?

10.注意union和or之间的替换

?

?

  相关解决方案