EXISTS 和 IN
IN
是把外表和内表作hash连接,而 EXISTS
是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为 EXISTS
比IN
的效率高的说法是不准确。如果查询的两个表大小(数据量)相当,EXISTS
和 IN
的效率差别不大
如果两个表中,其中一个表大(A表),另一个表较小(B表),则子查询表大的用 EXISTS
,子查询表小的用 IN
:
例如:
SELECT * FROM B WHERE cc IN (SELECT cc FROM A)
效率低,用到了B表上的索引。
SELECT * FROM B WHERE cc EXISTS (SELECT cc FROM A WHERE cc=B.cc)
效率高,用到了A表上cc列的索引
NOT EXISTS 和 NOT IN
如果查询语句使用了 NOT IN
那么内外表都进行全表扫描,没有用到索引;
而 NOT EXISTS
的子查询依然能用到表上的索引。所以无论那个表大,用 NOT EXISTS
都比 NOT IN
要快。
网友评论