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速度快.

posted @ 2024-05-20 20:50  low-reed  阅读(13)  评论(0)    收藏  举报