• 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%'


                                                                                                                                                                   

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

  • 相关阅读:
    SQL WHERE 子句:语法及案例剖析
    SQL SELECT DISTINCT 语句:语法及案例剖析
    SQL SELECT 语句:语法与案例剖析
    SQL 语法:一些最重要的 SQL 命令简介
    SQL 简介:什么是SQL,SQL能做什么
    mybatis 注解开发
    mybatis 缓存
    mybatis 延迟加载策略
    mybatis的多表查询
    mybatis 的动态 SQL 语句
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4833184.html
Copyright © 2020-2023  润新知