一条经典SQL语句优化实例

一条经典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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108652.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 搭建Android开发环境(超详细)

    搭建Android开发环境(超详细)文章转自:http://www.cnblogs.com/xdp-gacl/p/4322165.html搭建最新版本的Android开发环境  最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1.0是2008年发布的,截止到目前为止And

    2022年7月23日
    6
  • IOC控制反转与DI依赖注入

    IOC控制反转与DI依赖注入新建UserDao接口新建UserDaoImpl实现类IOC控制反转与DI依赖注入~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~开发工具与关键技术:IntellijIDEASpring作者:周欢撰写时间:2021/1/19~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~IOC(控制反转)作用:实现将组件间的关系从程序内部提…

    2022年6月20日
    25
  • [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    2022年1月13日
    46
  • 智能手机功能_android是什么品牌手机

    智能手机功能_android是什么品牌手机标签:小米(194)HTC(27)三星(1202)手机(807)打开各手机论坛,看到许多朋友在问usb调试在哪?usb调试模式怎么打开?“USB调试”是Android系统提供的一个用于开发工作的功能软件,在每个Android系统上都会自带,“USB调试”主要作用是在在计算机和Android设备之间复制数据、移动设备上安装应用程序。所以在我们联接电脑时,系统都会提示我们要打开“USB调试”。今天,…

    2025年11月4日
    3
  • mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集

    mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集这篇博客是基于GoogleColab的maskrcnn训练自己的数据集(以实例分割为例)文章中数据集的制作这部分的一些补充温馨提示:实例分割是针对同一个类别的不同个体或者不同部分之间进行区分我的任务是对同一个类别的不同个体进行区分,在标注的时候,不同的个体需要设置不同的标签名称在进行标注的时候不要勾选labelme界面左上角File下拉菜单中的StayWithImagesData选项否则生成的json会包含Imagedata信息(是很长的一大串加密的软链接

    2022年8月23日
    6
  • js遍历对象属性的一些方法有哪些_js面试遍历对象的所有属性

    js遍历对象属性的一些方法有哪些_js面试遍历对象的所有属性1.Reflect.ownKeys()静态方法Reflect.ownKeys()返回一个由目标对象自身的属性键组成的数组。2.Object.entries(obj)Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for…in循环遍历该对象时返回的顺序一致(区别在于for-in循环还会枚举原型链中的属性)。3.Object.fromEntr…

    2022年10月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号