下面将主查询的表称为外表;子查询的表称为内表。exists 与 in 的区别如下:
- 子查询使用 exists,会先进行主查询,将查询到的每行数据循环带入子查询校验是否存在,过滤出整体的返回数据;子查询使用 in,会先进行子查询获取结果集,然后主查询匹配子查询的结果集,返回数据
- 外表内表相对大小情况不一样时,查询效率不一样:两表大小相当,in 和 exists 差别不大;内表大,用 exists 效率较高;内表小,用 in 效率较高
- 不管外表与内表的大小,
not exists
的效率一般要高于not in
,跟子查询的索引访问类型有关