MySQL优化之in、exists、join

yuluodisuihe 2018-09-18 原文

MySQL优化之in、exists、join

一、inner join 、 in 、exists
1     explain
2     select a.id
3     from application as a
4     where exists(
5       select 1
6       from dispatch_app_history as d
7       where d.bomber_id = 165 and d.application_id = a.id
8     );
 
   

1     explain
2     select a.id
3     from application as a
4     where a.id in (
5       select d.application_id
6       from dispatch_app_history as d
7       where d.bomber_id = 165
8     );
 
    

1     explain
2     select a.id
3     from application as a
4     inner join dispatch_app_history as d on d.application_id = a.id
5     where d.bomber_id = 165;
分析:子查询需要application_id来关联外部表application,因为需要application_id字段,所以MySQL认为无法先执行这个子查询,而对application表进行全表查询。
结论:子查询、join查询具体性能怎么样需要根据实际情况决定
 
 
二、not in、not exists
    1、执行速度  
1      explain
2      select *
3      from dispatch_app as d
4      where d.application_id not in(
5         select dh.application_id
6         from dispatch_app_history as dh
7      );                       
     
 
    

1      explain
2      select *
3      from dispatch_app as d
4      where not exists (
5         select 1
6         from dispatch_app_history as dh
7         where d.application_id = dh.application_id
8      )
   
  结论:不考虑其他情况,通常情况下not exists的执行效率要高于not in
 
    2、条件中含有null
1      select *
2      from bomber as b
3      where not exists(
4         select 1
5         from dispatch_app_history as d
6         where d.partner_id = b.partner_id
7      )
8      group by b.partner_id;

 
     

1      select *
2      from bomber as b
3      where b.partner_id not in(
4         select distinct d.partner_id
5         from dispatch_app_history as d
6      );
  
结论:对于not in,条件中有null值的时候会直接停止执行返回null结果。对于not exists,条件中有null时会清除null后执行。in、exists的执行与not existst相同
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
发表于 2018-09-18 22:39 雨落滴碎荷 阅读() 评论() 编辑 收藏

 

版权声明:本文为yuluodisuihe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yuluodisuihe/p/9671894.html

MySQL优化之in、exists、join的更多相关文章

  1. join,left join,inner join,full join的区别?

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接 […]...

  2. SQL Server中的完全连接(full join) – 癫狂编程

    SQL Server中的完全连接(full join) 一、建库和建表 create database sco […]...

  3. mysql中 in 、not in 、exists、not exists 用法和差别

    exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A I […]...

  4. MySQL 子查询 EXISTS 和 NOT EXISTS

    MySQL EXISTS 和 NOT EXISTS 子查询 MySQL EXISTS 和 NOT EXISTS […]...

  5. 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

    开心一刻   一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!”   母牛说:“楼主来了关 […]...

  6. SQL Server中的完全连接(full join) – 癫狂编程

    SQL Server中的完全连接(full join) 一、建库和建表 create database sco […]...

  7. MS SQL 中 FULL JOIN 的用法

    以前写SQL 关联语句时,经常使用 LEFT JOIN 或者 INNER JOIN,很少使用FULL JOIN […]...

  8. mysql中/*!40000 DROP DATABASE IF EXISTS `top_server`*/;这中注释有什么作用?

    需求描述: 今天在进行mysqldump实验,使用–add-drop-databases参数,于是 […]...

随机推荐

  1. 1.5w字 + 24张图肝翻 TCP。

    TCP 是一种面向连接的单播协议,在 TCP 中,并不存在多播、广播的这种行为,因为 TCP 报文段中能明确发 […]...

  2. ms17-010漏洞利用记录

    一、前言 在复现一个靶场环境时发现 msf 自带的 ms17-010 模块不能成功拿到 meterpreter […]...

  3. UBUNTU12.4 安装磊科无线网卡驱动 – xiabodan

    UBUNTU12.4 安装磊科无线网卡驱动 在淘宝低价买了一个网卡,回来发现不能用 ,擦 无语了。 无赖只能在 […]...

  4. JVM优化过头了,直接把异常信息优化没了?

    你好呀,我是why。 你猜这次我又要写个啥没有卵用的知识点呢? 不好意思,问的稍微有点早了,啥提示都没给,咋猜 […]...

  5. CNN:Windows下编译使用Caffe和Caffe2

           用于检测的CNN分为基于回归网络的方法和基于区域+CNN网络的方法,其中基于回归网络的方法典型为 […]...

  6. 值得一用的 Windows 软件清单

    该清单仅本人使用后所作推荐,可能会比较主观,所以仅供参考。可能某些软件链接会失效,可以自行百度搜索下载即可。 […]...

  7. Linux – 查看文件信息的三个命令

    ls命令 – list directory contents 显示文件详细信息:ls -l < […]...

  8. 从零开始针对 .NET 应用的 DevOps 运营实践 – 运行环境搭建

    一、Overview 最近的一段时间,在公司里我都在进行基于 Jenkins 和 SonarQube 配合已有 […]...

展开目录

目录导航