zoukankan      html  css  js  c++  java
  • 一条经典SQL语句优化实例

     1、概述

    如下SQL语句发生严重消耗资源的问题,使得OS's load average会在30以上,一条语句需要执行上百秒。

    /*
    PIXPatient 184176条
    DomainPatient 184189条
    PersonName 184189条
    */

    捕获的SQL语句:

    select *

    from PIXPatient where PIXPatientTID
    in (select distinct PIXPatientTID from DomainPatient where DomainPatientTID
    in ( select DomainPatientTID from DomainPatient
      where PatientBirthday = '1994-01-09' or PatientBirthday = '1994-01-01'
      union select  DomainPatientTID from PersonName where FamilyName = '倪' or GivenName = '界'));

    2、优化

    a.优化前执行效率:
    mysql>

    select * from PIXPatient where PIXPatientTID
    in (select distinct PIXPatientTID from DomainPatient where DomainPatientTID
    in ( select DomainPatientTID from DomainPatient
      where PatientBirthday = '1994-01-09' or PatientBirthday = '1994-01-01'
      union select  DomainPatientTID from PersonName where FamilyName = '倪' or GivenName = '界'));

    图片
    b.加索引

    alter table PersonName add index Index_FamilyName (FamilyName), add index Index_GivenName (GivenName);
    alter table DomainPatient add index Index_PatientBirthday (PatientBirthday);

    效果不明显

    c.重构SQL语句(优化)
    mysql>

    select * from PIXPatient inner join (
        -> select distinct PIXPatientTID from DomainPatient inner join (
        -> select DomainPatientTID from DomainPatient  where PatientBirthday = '1994-01-09'
        -> union select DomainPatientTID from DomainPatient  where PatientBirthday = '1994-01-01'
        -> union select  DomainPatientTID from PersonName where FamilyName = '倪'
        -> union select  DomainPatientTID from PersonName where GivenName = '界' ) a using(DomainPatientTID) ) b using(PIXPatientTID) ;

    图片
    效果明显

    3、结论
    SQL语句中,尽量避免使用or,in关键字,因为执行效率低。

    规律:
    join > exists > in
    union > or

  • 相关阅读:
    121. 122. 123. 188. Best Time to Buy and Sell Stock *HARD* 309. Best Time to Buy and Sell Stock with Cooldown -- 买卖股票
    from __future__ import absolute_import
    sql之left join、right join、inner join的区别
    Eclipse workspace 被占用问题
    JavaScript SetInterval与setTimeout使用方法详解
    提示框3秒钟后自动消失
    页面加载及取消加载
    分层总结
    java中的注释
    canvas画图
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/6423074.html
Copyright © 2011-2022 走看看