MySQL中in和exists到底谁效率高

先看一下例子:

  • 出场过的球员都有哪些,并且显示他们的姓名、球员 ID 和球队 ID
    用EXISTS关键字:
SELECT player_name, player_id, team_id FROM player WHERE EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)  


用IN关键字:

SELECT player_name, player_id, team_id FROM player WHERE player_id IN (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)  


发现运行结果和上面的是一样的,那么问题来了,既然 IN 和 EXISTS 都可以得到相同的结果,那么我们该使用 IN 还是 EXISTS 呢?

我们可以把这个模式抽象为:

#对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大
select * from A where exists (select * from B where A.id=B.id);

#对A查询涉及id,使用索引,故A表效率高,可用大表 -->外大内小

select * from A where A.id in (select id from B);

(1)exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的使用exists,可加快效率;
(2)in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。
(3)如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。

总结:

1、in是把外表和内表做hash连接,先查询内表;
2、exists是对外表做loop循环,循环后在对内表查询;
3、在外表大的时用in效率更快,内表大用exists更快。

你可能感兴趣的:(MySQL中in和exists到底谁效率高)