JOIN与EXISTS(子查询)的效率研究

本文通过MySQL Sakila样例数据库对比了使用Exists子查询与Join联接查询在查找没有演员的电影时的不同性能表现。实验结果显示,Left Join的查询方式在特定场景下比Exists子查询更为高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用MySQL提供的Sample数据库Sakila

现将profiling打开,用来一会查看sql执行时间

set profiling=1;

 exists 子查询与 join联接效率的对比,功能:查看没有演员的电影

EXPLAIN SELECT film_id, language_id FROM sakila.film
WHERE NOT EXISTS(
    SELECT * FROM sakila.film_actor
    WHERE film_actor.film_id = film.film_id
);

 

EXPLAIN SELECT film_id, language_id FROM sakila.film
    LEFT JOIN sakila.film_actor USING(film_id)
WHERE film_actor.actor_id IS NULL; 

他们只有一点细微的区别,一个select_type,还有就是Extra里后者用了Not exists,也就是提前终止算法,当遇到第一个actor_id不是null的时候,就舍弃这个电影的筛选.

最后来看看二者的效率

可知使用子查询Exists的效率要低一些.

 

复制代码
SELECT DISTINCT film_id FROM sakila.film
    JOIN sakila.film_actor USING(film_id);

SELECT film_id FROM sakila.film
    WHERE EXISTS (
    SELECT * FROM sakila.film_actor
    WHERE film.film_id = film_actor.film_id);

SHOW PROFILES;
复制代码

可以看出.依然EXISTS效率要低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值