在我们开发过程中,初期可能不会去太关注我们自己写的sql语句的效率怎么样,因为总是觉得可以拿取到数据就算是ok了,可能也会注意一下你的sql执行的时间,但是在开发的过程中因为数据量的原因,其实你不去了解一下sql的一些优化的手段其实是无法感知你的sql的效率问题。我之前博客也写过一篇关于sql的优化一些需要注意的点,而我们本节主要是针对in与exists的区别以及什么时候使用in,什么时候使用exists。

in与exists的区别

  • in:in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,他是先将数据督导内存中,然后取与外表匹配。他要执行的次数是外表的长度*内表结果的长度
  • exists:exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引,他只需要执行的次数是外表的长度。
    可能说完之后还是一脸懵逼,那么接下来我们会通过一个简单的例子来加以说明:
    首先我们有a表和b表
    a表有以下几个字段
    id(学生id),name(学生姓名),age(学生年龄)
    b表有以下几个字段
    course(课程名称),studentId(学生ID)
    规定一个学生可以选择n们课程,然后我们需要查出学修了某些课程的所有学生的信息,
    通常对于上面的东西,我们有两种方式实现:
    使用in方式实现
   select * from a where id in(select studentId where name='xxx')

使用exists实现

 select * from a where exists (select studentId where name='xxx' and a.id=studentId)

in想必大家用的很多吧,原理也是很简单就是和我们上面一样,而exists的原理就不一样了,他是通过子查询返回的数据是否为null,如果不为null,那么就会将当前的数据加入结果集,因此我们select * from a的时候,我们是从第一条数据开始执行的,每次执行都会去执行exists的子查询,如果不为null就加入结果集,反之则不加入,直到最后执行完主查询为止。

可能我们从网上去找sql优化的时候就会发现他会发现他们都建议我们将in换成exists。但是在仔细去找的时候,又会发现使用in和exists是分不同的场景的,主要是以下场景:
1、a表的数据少于b表的数据那么就使用exists
2、如果a标的数据多余b表的数据,那么就使用in
3、如果一样其实是没有区别的
然后我就按照这个逻辑去弄了,顺便调试了下,发现没有什么区别(这个是数据量很少很少的情况下),然后我就闲着没事,我就去增加了大数据(这时候a表的数据为2w条,b表的数据为(30w条)),这时候我就继续去用这两种方法去做实验,如果按照我们之前的逻辑的话,那么就必须使用exists来,但是事实上我发现了使用exists时的查询耗时的时间是in的十几倍,这时候我就纳闷了,
使用in查询结果耗时

使用exists查询结果耗时:

这时候我就猜想他说b表数据要大于a表的意思是不是指查找过后的数据,我就抱着这种想法去试一下,这时候我在次增加了b表的数据,但是这次是增加某门课程的数据(不同的学生)增加了10w条,然后我在次使用exists和in去查找,这个时候就发现exists的查询效率比in高好多。然后发现别人是不是写错了,
事实上别人没有写错,只是我们误解了,既然子查询查出来的数据要大于a表,那么b表的数据也就一定高于a表,因此他们的说发也没问题。
使用in的场景:a表的数据大于b表的数据(关联查询后的数据)
使用 exists的场景:a表的数据小于b表的数据(关联查询后的数据)
如果数据量相同in和exists都可以使用

既然说到了in和exists,那么我们就顺便带过一下not in 和not exists。
当我们要使用not in的时候建议直接将他替换成not exists,不论a表的数据与b表的数据相差多大。
有的人会问为什么?
其实很简单。我们数据库只会告诉你数据在哪里,而不会告诉你数据不在哪里,因此使用not in一定会导致索引失效,那 not exists为什么不会失效呢?因为not exists其实就相当于我们查询出来的数据取反,即有和无,他本身是不参与sql的执行,因此他是不会导致所以失效的。

sql优化之in与exists相关推荐

  1. PostgreSQL 一复合查询SQL优化例子 - (多个exists , 范围检索 , IN检索 , 模糊检索 组合)...

    标签 PostgreSQL , 多个exists , 范围检索 , IN检索 , 模糊检索 , 组合 , gin , recheck , filter , subplan 背景 当一个SQL包含复杂的 ...

  2. inner join 和 exists 效率_19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧

    在介绍具体的 SQL 调优的方法前,我们先来简单了解下 MySQL 调优金字塔理论. 如上图所示,数据库优化维度有四个:硬件.系统配置.数据库表结构.SQL 及索引. 优化成本: 硬件>系统配置 ...

  3. SQL优化(三):子查询和IN,EXISTS用法和优化方法

    用法 1. 与IN结合使用 子查询与IN结合使用时,通常通过子查询查询出某个表单列的值,然后作为外层的SELECT的IN查询的数据源,如下,查询今天进行了购物的用户列表,首先通过子查询在订单表t_or ...

  4. 中秋节,送上一次非常有趣的SQL优化实战经历

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取4T学习资料 补充:看到好多朋友后台留言说 ...

  5. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  6. MySQL进阶SQL优化

    MySQL进阶SQL优化 查询效率分析: 子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代. 如果要用子查询,那就用EXISTS替代IN.用NOT ...

  7. 5大步骤+10个案例,堪称SQL优化万能公式

    作者丨狼爷 来源丨网址:https://www.cnblogs.com/powercto/p/14410128.html 一.前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随 ...

  8. 15 种 SQL 优化中,老司机才懂的处理技巧

    前言 SQL优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化SQL语句,因为它 ...

  9. SQL优化的一些知识

    2019独角兽企业重金招聘Python工程师标准>>> (本文主要讲解SQL的优化,不涉及数据库配置方面的调整,关于数据库如何配置,等以后有时间再写,此内容结合工作经验和网上内容简要 ...

最新文章

  1. P1522 牛的旅行
  2. Linux下多窗口分屏式终端--Terminator
  3. Insertion Sort List,Merge Two Sorted Lists,Sort List
  4. ActiveMQ的消息存储(八)
  5. VS2008的debug窗口
  6. JavaScript 精粹 基础 进阶(5)数组
  7. python之质数判断
  8. Linux基础学习(5)
  9. Android NDK开发Crash错误定位
  10. eclipse中html设置,无法在eclipse中设置HTMLUNIT
  11. Gateway配合sentinel自定义限流_Spring Cloud Gateway网关如何快速实施限流方案?-Part 6...
  12. 强大的Android参数模拟器,自由修改手机型号、SDK版本号等信息
  13. mongodb WT_ERROR: non-specific WiredTiger error
  14. DC(Design Compiler)使用说明
  15. Python数据分析入门笔记4——数据预处理之重复值
  16. 区块链交易明细中各字段的含义
  17. matlab中的符号计算,sym、syms的区别
  18. 重复读取输入流InputStream
  19. 【1030】计算球的体积
  20. 《演化学习:理论和算法的进展》

热门文章

  1. HTTP代理,代理服务器
  2. 图像增强(2)-旋转一定的角度,同时处理图片和标注好的xml文件
  3. jQuery设置input不可编辑
  4. 魅蓝2 android os,魅蓝note2的原生android系统刷机包
  5. 官方mysql的最新版下载网址
  6. 从零开始学习CANoe(十二)—— Trace Window
  7. 教你怎么提高网速 最全提高网速方法
  8. OpenStack“女王”驾到,开源云中文社区粉丝炸锅了!
  9. SpringBoot整合RabbitMQ 消息可靠投递、手动ack、延迟队列、死信队列、消息幂等性保障、消息积压
  10. java研发简历怎么写_Java研发实习生入党个人简历怎么写