待查询字段是否有索引是个前提,在这个前提下,其实二者的选择与否还是要看表的大小。可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。
比如下面这样:
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc)
其过程相当于一个【双层For循环】。当 A 的数据量小于 B 数据量 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于:
for i in A
for j in B
if j.cc == i.cc then ...
当 B 小于 A 时用 IN,因为实现的逻辑类似于:
for i in B
for j in A
if j.cc == i.cc then ...
结论: 哪个表小就用哪个表来驱动 ,A 表小就用 EXISTS,B 表小就用 IN。