exists与in的查询方式

In:是把外表和内表做Hash 连接

exists:是对外表作loop 循环,每次loop循环再对内表进行查询

典型的连接类型共有3种:

排序- 合并连接(Sort Merge Join (SMJ) )

嵌套循环(Nested Loops (NL) )

哈希连接(Hash Join)

效率分析

比如:

A表(主查询,即:外表)和B表(子查询,即:内表)关联查询;

当A表和B表大小相当时,用in和exists查询效率差不多;

当A表(主查询)比B表(子查询)大的时,即子查询表小的时候用In效率高;

当A表(主查询)比B表(子查询)小的时,即子查询表大的时候用exists效率高;

格式不同

1、In:

select a.* from A where a.id in (select b.id from B b)

2、exists:

select a.* from A where exists (select b.id from B b where a.id=b.id)

例如 :

表A(主查询)大,B表(子查询)小

in 查看:

select a.* from A where a.id in (select bid from B b)相当于:select * from A a, (select b.id from B b) c where a.id = c.id

效率低的原因

全程扫描B表,用到A 表上的a.id的索引,因为A表大

exists 查看

select * from a where exists (select b.id from B b where b.id = a.id)

效率高的原因:

全程扫描A表,用到B表上的b.id的索引,因为B表大

Not in 和Not Exists 的 效率

格式不同:

In:

select a.* from A where a.id not in (select b.id from B b)

exists:

select a.* from A where not exists (select b.id from B b where a.id=b.id)

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。 所以无论那个表大,用not exists都比not in要快。

关联子查询与非关联子查询

关联子查询需要在内部引用外部表,而非关联子查询不要引用外部表。对于父查询中处理的记录来说,一个关联子查询是每行计算一次,然而一个非关联子查询只会执行一次,而且结果集被保存在内存中(如果结果集比较小),或者放在一张oracle临时数据段中(如果结果集比较大)。一个“标量”子查询是一个非关联子查询,返回唯一记录。如果子查询仅仅返回一个记录,那么oracle优化器会将结果缩减为一个常量,而且这个子查询只会执行一次。

如何选择?

根据外部查询,以及子查询本身所返回的记录的数目。如果两种查询返回的结果是相同的,哪一个效率更好?

关联子查询的系统开销:对于返回到外层查询的记录来说,子查询会每次执行一次。因此,必须保证任何可能的时候子查询都要使用索引。

非关联子查询的系统开销:子查询只会执行一次,而且结果集通常是排好序的,并保存在临时数据段中,其中每一个记录在返回时都会被父级查询引用,在子查询返回大量记录的情况下,将这些结果集排序回增大系统的开销。

所以:如果父查询只返回较少的记录,那么再次执行子查询的开销不会非常大,如果返回很多数据行,那么直查询就会执行很多次。 如果子查询返回较少的记录,那么为内存中保存父查询的结果集的系统开销不会非常大,如果子查询返回多行,那么需要将结果放在临时段上,然后对数据段排序,以便为负查询中的每个记录服务。

mysql中exists 和 in的用法你还真不知道相关推荐

  1. mysql中有exist吗_关于MySQL 中 EXISTS 的用法

    需求: 在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b: create tablea ( a_idint, a_namevarcha ...

  2. mysql中exists用法

    在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...

  3. MySQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  4. Mysql中rank类的函数用法

    Mysql中rank类的函数用法 rank() over 作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续. 说明:例如学生排名,使用这个函数,成绩相同的两名是并列,下一位同学空出所占 ...

  5. MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法

    MySQl学习(MySQL数据库,从入门到精通:第四篇--MySQL中常用的运算符及其用法 第四篇_MySQL中常用的运算符及其用法运算符 1. 算术运算符 1.加法与减法运算符 2.乘法与除法运算符 ...

  6. MySQL中ALL 和 ANY的用法

    "历览前贤国与家,成由勤俭破由奢" 序 今天看书得到MySQL中ALL和ANY的用法,在此之前甚至都不知道MySQL还有这两个运算符. 现在数据表如下,分别是姓名.薪水.部门ID: ...

  7. MySQL中exists与in的使用

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  8. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  9. 浅析MySQL中exists,in ,=的使用

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  10. 5、MySql中exists 和in的效率比较

    先下结论: 如果查询的两个表大小相当,那么用in和exists差别不大 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 所以无论那个表大,用not exists都 ...

最新文章

  1. linux的cat命令
  2. PCL点云库学习(1):环境配置(Ubuntu16.04+QT5+VTK8.0)
  3. oracle表格颜色,如何在oracle中使用光标更新特定颜色
  4. 腾讯3轮面试都问了Android事件分发,原理+实战+视频+源码
  5. 团队项目第二次冲刺(4)
  6. python魔法方法(一)
  7. 凸优化第四章凸优化问题 4.6 广义不等式约束
  8. 创新者的窘境 Teh Innovator‘s Dilemma
  9. linux 查看网口实时流速_Linux查看实时带宽流量情况
  10. BMZCTF misc1
  11. Mybatis(狂神老师上课笔记)
  12. 承上启下继往开来,Python3上下文管理器(ContextManagers)与With关键字的迷思
  13. 互联网域名管理办法发布 域名注册必须实名
  14. html的abbr标签,html中如何使用abbr标签
  15. Alien Skin Exposure X5 Bundle Mac(PS/LR照片胶片滤镜插件)
  16. DUTOJ1205(大数)
  17. VC++操作Excel生成饼状图!
  18. FinalShell密码找回/FinalShell密码破解
  19. PotPlayer 和 VLC 播放器的书签
  20. 高手帮忙啊!关于插入数据库的问题!急急!菜鸟提问!

热门文章

  1. 对比文件md5值实现去重文件
  2. 【Nodejs篇三】Node js npm包管理工具
  3. P1868 饥饿的奶牛
  4. 几种类型的db,以及最新的db排名,看一下
  5. sqlserver2008r2通过发布和订阅的方式进行数据库同步
  6. 中国网站备案制度——祸国殃民
  7. linux内核之数据机构
  8. linux内核之时间子系统
  9. 设备驱动基础1:设备模型之总线,驱动,设备
  10. 从著名的list_head看linux内核中OO 从Unix分层内核栈以及中断处理看Linux内核的另类