`
alex_gao
  • 浏览: 79663 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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之间的替换

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics