MySQL中exists和in的区别
网上很多文章都说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的区别相关推荐
- mysql''和null,mysql中NULL和null的区别
接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...
- mysql中有exist吗_关于MySQL 中 EXISTS 的用法
需求: 在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b: create tablea ( a_idint, a_namevarcha ...
- MySQL中EXISTS的用法
比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...
- mysql中exists用法
在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...
- Mysql中的count()与sum()区别
Mysql中的count()与sum()区别 首先创建个表说明问题 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` ...
- MySQL中interactive_timeout和wait_timeout的区别
2019独角兽企业重金招聘Python工程师标准>>> 在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ? 1 2 3 E ...
- mysql中的blob和text区别
mysql中的blob和text区别 经过查询资料发现 除了blob 还有tinyblob longblob mediumblob 当然text还有tinytext mediumtext longte ...
- mysql中char与varchar的区别分析
原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中cha ...
- mysql中where和and的区别
本文来说下mysql中where和and的区别 文章目录 概述 内连接的时候 左外连接的时候 本文小结 概述 多表查询语法结构:table_reference {[INNER] JOIN | {LEF ...
- 【038】MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?
♣题目部分 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? ♣答案部分 (1).varchar与char的区别区别一,定长和变长char 表示定长,长度固定, ...
最新文章
- python处理excel-python处理Excel的简单示例
- 注意| .NET开发者大会防疫须知 !
- windows 下 git 禁用 CRLF 转换 LF
- Getting started with Bitcoin
- 搜狗输入法回应误推地震信息;近亿人在钉钉上报健康情况;Rust 1.41.0发布 | 极客头条...
- sklearn preprocessing 数据预处理(OneHotEncoder)
- 科技圈晒开工福利!小米最直接,腾讯最传统,阿里最豪气,你们家的呢?
- python设计模式-模板方法模式 1
- 网页交互式MATLAB入门教程
- 启用windows功能NetFx3时出错,终极方法
- 阿里巴巴矢量图库的具体使用用法可以变色改变大小
- Ubuntu20.4安装gnuradio艰辛之路
- obtain,get,gain有什么区别
- amoeba mysql_Mysql 基于 Amoeba 的 读写分离
- python tkinter ttk的使用(下)
- 新型的Hbb项目目录结构
- openresty-lua代码的语法检查
- 使用 Matlab 解决数学建模问题
- 全球与中国带灯轻触开关市场现状及未来发展趋势
- 基于JAVA的免费手机归属地接口查询