当前位置:   article > 正文

EXISTS和IN的区别_in和exists的区别

in和exists的区别

一.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

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

(2)exists

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

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

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

 (1) in

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

 (2)exists

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

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

三.总结

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/479934
推荐阅读
  

闽ICP备14008679号