昨天改一个需求的时候用到了子查询,我们的系统用的都是 in ,因为想到之前看到sql优化的时候要用exists代替in,效率会比较高,但是忘了这是在有索引的前提下,所以我把语句从in改成了exists,然后发现加上项目号的查询速度非常非常慢,简直到了无法忍受的地步,都直接报超时了,这时我又把exists改成了in,测试发现in的效率跟没有子查询时的效率几乎一样,嗯?不是exists比in的效率要高的吗?
事实上,存在即合理,既然有了exists还有in那就说明in在某些方面也是有优势的。
一个in子查询对应的exists子查询会把普通的子查询变成关联子查询,内查询的条件要依赖于外部的查询结果,所以exists是先查外部表,再根据外部表的数据查内部表,而in是先查内部表,然后再过滤数据。
in适合外表大,内表小的情况。
exists适用于外表小而内表大的情况。