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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 基于Vue3.0的电商后台管理系统—前端

    基于Vue3.0的电商后台管理系统—前端历时一个月,从开始学习vue到能用vue开发一个简单的系统,以下是开发这个系统的简单报告。所用的技术:git:管理代码的开发node.js:vue.js运行环境vue3.0:最新版本vue-cli3.0:脚手架最新版本,支持图形化操作webstorm:代码编辑器项目新增插件:vue-cli-plugin-element:elementUI库项目新增的依赖:…

  • docker修改mysql配置

    docker修改mysql配置Docker修改MySQL配置作者:YoungJ前言:大部分程序员在刚使用docker时,按照教程迅速的就装完了mysql,在使用的过程中出现各种问题:比如中文乱码、com.mysql.jdbc.PacketTooBigException:Packetforqueryistoolarge(1053>1024).等等,最简单的方式通过sql去设置,但每次重启又还原了,…

  • 装上这 8 个插件,PyCharm才真的是无敌的存在!

    装上这 8 个插件,PyCharm才真的是无敌的存在!给IT入门加星标,提升编程技能ChinesePlugin经常听到很多初学者抱怨说,PyCharm怎么是全英文的?学起来好难啊。在以前,我会跟他们说,学习编程语言,英文是一项非常重要的能…

  • pycharm 激活码【2021免费激活】

    (pycharm 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL5S9V8F-eyJsaWNlbnNlSWQiOi…

  • 一维数组二分法查找_二分查找算法c语言

    一维数组二分法查找_二分查找算法c语言在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回

  • cannot open image file 1:-1_linux C

    cannot open image file 1:-1_linux C关于使用《FirstOrderMotionModelforImageAnimation》Github项目中所遇到的OSError:Failedtoopenfileb’C:\\Users\\\xe6\x96\x87…\\AppData\\Local\\Temp\\scipy-xxxxx报错原因:路径中包含中文解决方案:修改计算机环境变量中的Temp文件夹路径OSError:Failedtoopenfileb’C:\Users\\xe6\x96\x87…\AppDa

发表回复

您的电子邮箱地址不会被公开。

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