in和exists过程对比

Posted noodlerkun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了in和exists过程对比相关的知识,希望对你有一定的参考价值。

两者执行流程完全不一样。

in的过程

select * from tableA a where a.id in (select b.a_id from tableB b);

1)首先子查询,查询B表中所有的aid,结果集 listB。

2)进行外查询,结果集 listA。

3)list和listB取笛卡尔积,即有 listA.len*listB.len 条记录。根据 a.id=b.a_id 对笛卡尔积结果进行筛选。

for(t in listA.len*listB.len){

if(t.id == t.aid) {

list.add(t);

}

}

retrun list;

所以,in的效率取决于in子查询。

 

exists的过程

select * from tableA a where exists (select 1 from tableB b where a.id=b.a_id);

1)外查询,这里是select * from tableA a,结果集 listA。

2)对 listA 的a.id进行exists筛选。

for(a in listA.length){

if( (select 1 from tableB b where b.a_id=a.id) != null ) {

list.add(a);

}

}

所以,exists的效率取决于外查询。

 

总结

当子查询的结果集相对很大时,千万不要用 in。

所以,除非子in查询结果集很小(比如字典),一般都优先使用exists(没有in的笛卡尔积)。

 

not in 和 not exists

虽然“一般情况下,使用exists比使用in更好”的说法不一定准确,

但是“一般情况下,使用 not exists 比使用 not in 更好”的说法是没问题的。

使用 not in 会对外表和内表进行全表扫描,会忽略掉索引;

使用not exists的子查询可以使用表的索引的。

所以,无论子查询结果集大小,使用 not exists 要比 not in 来的快。

 

参考:

https://www.cnblogs.com/liyasong/p/sql_in_exists.html

 

以上是关于in和exists过程对比的主要内容,如果未能解决你的问题,请参考以下文章

深入理解PHP之isset和array_key_exists对比

es6 语法 (mapset和array 的对比)

oracle where exists 2

map/set/object/array对比

impala find_in_set 与性能对比

批处理bat获取文件a.txt的最后修改时间,与当前系统时间进行对比,如果小于15分钟,就打开1.