晚上陪孩子写作业,他突然抬头问我:‘爸爸,数据库查数据时,用IN还是EXISTS更快?’我愣了一下,没想到这问题会从一个初中生嘴里冒出来。原来他最近在自学编程,正卡在这个知识点上。
IN和EXISTS到底有啥区别?
先别急着比速度,得搞清楚它们干的活儿不一样。IN适合拿一个值去匹配一堆已知的列表,比如查班里张三、李四、王五这三个同学的考试成绩:
SELECT * FROM scores WHERE name IN ('张三', '李四', '王五');
而EXISTS是看子查询有没有结果,常用于判断“是否存在”这种场景。比如找那些有补考记录的学生:
SELECT * FROM students s WHERE EXISTS
(SELECT 1 FROM retakes r WHERE r.student_id = s.id);
数据量小的时候,真没差
就像家里请客,来三五个人,用一次性碗筷还是洗瓷碗,花的时间差不多。数据库也一样,几千条数据里查,IN和EXISTS跑起来你都感觉不出谁快谁慢。
大数据面前,EXISTS往往更扛得住
有一次学校要导出全校十年的考勤异常记录,开发同事一开始用了IN,结果卡了二十分钟还没出结果。换成EXISTS后,三分钟搞定。原因是IN会把子查询全跑完,生成一个大列表,内存撑爆;而EXISTS找到第一条就停,像探路的侦察兵,效率自然高。
别光听理论,看看实际怎么选
如果你要查‘哪些班级有学生迟到’,子查询结果可能成千上万,这时候EXISTS更稳。但如果你手头已经有个固定名单,比如‘五一班、五四班、五七班’要查成绩,IN写起来简单,执行也不拖沓。
后来我跟孩子说:‘你看你们班点名,老师喊名字,你在不在,这是EXISTS;发奖状时念获奖名单,你是其中一个,那就是IN。’他点点头,笑了:‘那我肯定是IN,不是EXISTS。’