偶遇这样一个场景,使用IN关键字进行检索数据所消耗的时间是使用EXISTS关键字进行检索数据所消耗的时间的接近30倍。一看差距这么大,查阅了一本SQL数据,其中也没有介绍多少,不过我们可以从其定义中可以领悟到一些差异。
(1)IN关键字:该操作符IN用于把一个值与一个指定列表进行比较,当被比较的值至少与列表中的一个值相匹配时,它会返回TRUE。
(2)EXISTS关键字:该操作符EXISTS用于搜索指定表里是否存在满足特定条件的记录。
根据这两个关键字作用的描述,可知:若是IN子句或者EXISTS子句都是采用SELECT语法检索出来的结果列表进行匹配的话,那么在IN子句中还要将被比较值与结果列表做进一步的循环比较,当IN中的被比较值能够匹配到结果列表中某个值,那么IN子句就会返回TRUE,否则的话就会返回FALSE;而在EXISTS子句中,若SELECT语句检索的结果值不为空,那么EXISTS子句直接将该结果集返回,若是检索的结果值为空的,那么EXISTS子句就返回空,也就是说EXISTS子句返回的就是SELECT语句返回的结果集,不需要再次做比较判断了。
-- IN SELECT column1 FROM table_name WHERE some_col IN (SELECT column1 FROM table_name WHERE other_col > ‘xx‘); -- EXISTS SELECT column1 FROM table_name WHERE EXISTS (SELECT column1 FROM table_name WHERE other_col > ‘xx‘);
上述代码示例只是一个象征性的对比说明,在同一个表中进行不同条件的多次检索,使用IN的方式:先根据条件检索出数据,然后some_col与结果列表进行循环比较;使用EXISTS的方式:先根据条件检索出数据,然后将该结果集直接返回,作为最终的数据结果了。由此可见,IN和EXISTS子句耗时不在于SELECT检索的时间,而是在于其自身所消耗的时间。所以在IN子句中,若动态的结果集数据量比较大的话,还是建议使用EXISTS子句来替换。