网上很多文章都说exists的效率要高于in,其实不然。只能说不一定,exists和in各有各的使用场景,下面我们总结一下MySQL中exists和in的区别:

in关键字

select * from A where id in (select id from B)

#等价于

  • for select id from B:先执行;
  • 子查询 for select id from A where A.id = B.id:再执行外面的查询;
执行过程:in是先查询内表【select id from B】,再把内表结果与外表【select * from A where id in …】匹配,对外表使用索引,而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。

小总结:当A表的数据集大于B表的数据集时,用in优于exists。【in适合外部表数据大于子查询的表数据的业务场景】

exists关键字

语法格式:

select ... from table where exists (subquery);
可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE)来决定主查询数据结果是否得到保留。

如下:

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

#等价于

  • for select id from A:先执行外层的查询;
  • for select id from B where B.id = A.id:再执行子查询;
执行过程:exists是对外表【select * from A where exists …】做loop循环,每次loop循环再对内表(子查询)【select 1 from B where B.id = A.id】进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(所以尽量用小表),故内表大的使用exists,可加快效率。

例如:

select * from A where exists (select 1 from B where B.id = A.id)
   1)、表A中100000条数据,表B中100条数据,那么查询数据库的次数 = 1(表A查一次) + 100000(子查询:查询表B的次数)  ,一共 100001次;2)、表A中 100条数据,表B中100000条,查询数据库次数 = 1(表A查一次) + 100(子查询次数),一共 101次;

可见,只有当子查询的表数量远远大于外部表数据的时候,用exist查询效率好于in;

提示

1. EXISTS (subquery) 只返回 True 或 False , 因此查询的 SELET * 也可以是SELET 1 或其他,官方说法是执行时会忽略SELECT 清单, 因此没有区别;
2. EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解的逐条比对,如果担忧效率问题,可以进行实际检验以确定是否有效率问题;
3. EXISTS 子查询往往也可以使用条件表达式、其他子查询或者 JOIN 来代替,何种最优化需要具体分析;

> 小总结:当A表的数据集小于B表的数据集时,用exists优于in。【exist适合子查询中表数据大于外查询表中数据的业务场景】

总结

select * from A where id in (select id from B)
select * from A where exists (select 1 from B where B.id = A.id)
当A表的数据集大于B表的数据集时,用in 优于 exists;
当A表的数据集小于B表的数据集, 用 exists 优于 in【注意: A与B表的id 字段应该建立索引】;
如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in;

MySQL中exists和in的区别相关推荐

  1. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

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

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

  3. MySQL中EXISTS的用法

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

  4. mysql中exists用法

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

  5. Mysql中的count()与sum()区别

    Mysql中的count()与sum()区别 首先创建个表说明问题 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` ...

  6. MySQL中interactive_timeout和wait_timeout的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ? 1 2 3 E ...

  7. mysql中的blob和text区别

    mysql中的blob和text区别 经过查询资料发现 除了blob 还有tinyblob longblob mediumblob 当然text还有tinytext mediumtext longte ...

  8. mysql中char与varchar的区别分析

    原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中cha ...

  9. mysql中where和and的区别

    本文来说下mysql中where和and的区别 文章目录 概述 内连接的时候 左外连接的时候 本文小结 概述 多表查询语法结构:table_reference {[INNER] JOIN | {LEF ...

  10. 【038】MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?

    ♣题目部分 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? ♣答案部分 (1).varchar与char的区别区别一,定长和变长char 表示定长,长度固定, ...

最新文章

  1. python处理excel-python处理Excel的简单示例
  2. 注意| .NET开发者大会防疫须知 !
  3. windows 下 git 禁用 CRLF 转换 LF
  4. Getting started with Bitcoin
  5. 搜狗输入法回应误推地震信息;近亿人在钉钉上报健康情况;Rust 1.41.0发布 | 极客头条...
  6. sklearn preprocessing 数据预处理(OneHotEncoder)
  7. 科技圈晒开工福利!小米最直接,腾讯最传统,阿里最豪气,你们家的呢?
  8. python设计模式-模板方法模式 1
  9. 网页交互式MATLAB入门教程
  10. 启用windows功能NetFx3时出错,终极方法
  11. 阿里巴巴矢量图库的具体使用用法可以变色改变大小
  12. Ubuntu20.4安装gnuradio艰辛之路
  13. obtain,get,gain有什么区别
  14. amoeba mysql_Mysql 基于 Amoeba 的 读写分离
  15. python tkinter ttk的使用(下)
  16. 新型的Hbb项目目录结构
  17. openresty-lua代码的语法检查
  18. 使用 Matlab 解决数学建模问题
  19. 全球与中国带灯轻触开关市场现状及未来发展趋势
  20. 基于JAVA的免费手机归属地接口查询

热门文章

  1. ubuntu mysql 升级_Ubuntu 升级mysql 之后的一些问题
  2. MDP马尔可夫决策过程
  3. Momentum动量法
  4. 代码整洁之道读书笔记----第二章---命名--第一节-名副其实
  5. java笔试+面试总结(大纲)
  6. 《A Tutorial on Automated Text Categorisation》NOTE
  7. about HashMap
  8. 常用算法之-快速排序
  9. 【POJ 3057】Evacuation【最大流+二分】
  10. 通过图标来识别网站用户指纹