在MySQL 8.0.18版本里,支持對NOT IN/EXISTS子查詢語句優化,優化器內部將查詢自動重寫爲AntiJoin反連接查詢SQL語句。
通常情況下,我們希望由內到外,先完成內表裏的查詢結果,然後驅動外查詢的表,完成最終查詢,但是子查詢會先掃描外表中的所有數據,每條數據將會傳到內表中與之關聯,如果外表很大的話,那麼性能上將會很差。
讓我們看一個例子
explain select * from t1 where id not in (select id from t2);
優化器在內部,是將not in子查詢重寫爲下面的語句
explain select t1.* from t1 left join t2 on t1.id=t2.id where t2.id is null;
對比兩個執行計劃,結果是一樣的。