EXISTS 和 IN 的效率比较

2017-02-22  本文已影响21人  軍_

EXISTS 和 IN

IN 是把外表和内表作hash连接,而 EXISTS 是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为 EXISTSIN 的效率高的说法是不准确。如果查询的两个表大小(数据量)相当,EXISTSIN 的效率差别不大

如果两个表中,其中一个表大(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 要快。

上一篇下一篇

猜你喜欢

热点阅读