in 和 exists 一般用于子查询。
使用 exists 时会先进行外表查询,将查询到的每行数据带入到内表查询中看是否满足条件;使用 in 一般会先进行内表查询获取结果集,然后对外表查询匹配结果集,返回数据。
in 在内表查询或者外表查询过程中都会用到索引。
exists 仅在内表查询时会用到索引
一般来说,当子查询的结果集比较大,外表较小使用 exist 效率更高;当子查询寻得结果集较小,外表较大时,使用 in 效率更高。
对于 not in 和 not exists,not exists 效率比 not in 的效率高,与子查询的结果集无关,因为 not in 对于内外表都进行了全表扫描,没有使用到索引。not exists 的子查询中可以用到表上的索引。