EXISTS和IN的区别

一.EXISTS和IN的介绍

1. exists

exists返回的是true(空)和flase(非空)

对user表的每行数据逐条取出,每取一行,就判断exists后面的子语句的结果是否为空,是空,这行数据就不要,不是空,这行数据就留下.
如下:

select * from A where exists (select 1);

对user表的记录逐条取出,由于子条件中的select 1永远是true,那么user表的所有记录都将被加入结果集,所以与select * from user;是一样的。

总结:如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件。

2. in

in查询相当于多个or条件的叠加,这个比较好理解,比如下面的查询:

select * from user where user_id in (1, 2, 3);

等效于

select * from user where user_id = 1 or user_id = 2 or user_id = 3;

二.EXISTS和IN的性能分析

student表有500万数据,  t1表有4条数据.

情况一:大表做主表,小表做子表. 

 (1) in

SELECT * FROM `student` a WHERE a.sid in (SELECT jgid FROM t1 );
//耗时0.014秒

(2)exists

SELECT * FROM `student` a WHERE EXISTS (SELECT * FROM t1 WHERE t1.jgid = a.sid);
//耗时53.4秒

可以看出,主表比子表大很多时,用in速度快.

情况二:小表做主表,大表做子表. 

 (1) in

SELECT * FROM t1 a WHERE a.id in (SELECT classid FROM student );
//用时2.4秒

 (2)exists

SELECT * FROM t1 a WHERE EXISTS (SELECT * FROM student WHERE student.classid = a.id);
//耗时0.012秒

 可以看出,主表比子表小很多时,用exists速度快.

三.总结

其实sql在执行的时候会自动被mysql优化,很复杂.

所以,简单就认为主表比子表大很多时,用in速度快.主表比子表小很多时,用exists速度快.

————————————————
版权声明:本文为CSDN博主「lzcWHUT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jinjiniao1/article/details/92666614

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值