赞
踩
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条件。
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;
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。