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

  • 相关阅读:
    js 模拟表单提交下载文件
    vue 刷新子组件方法解决使用v-if闪屏问题
    Java15-Tomcat&Servlet&HTTP&Request&Response
    JAVA26-SpringBoot-在线教育项目01
    20 Vue-ajax
    19 Vue-JQuery
    18 Vue-Json
    Java 20-Mybatis学习
    17 Vue-ES6语法之Promise、VueX、网络请求封装
    16 Vue-cli脚手架介绍与使用
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/6423074.html
Copyright © 2011-2022 走看看