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