SQL优化必知技巧——使用exists 代替 in

本文对比了使用in和exists进行SQL查询的效率,通过具体示例解释了为什么exists方式通常比in方式更快,尤其是在处理大量数据时。exists查询在找到第一条匹配记录后即停止,而in则需创建并遍历临时表。

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

SQL优化必知技巧——使用exists 代替 in

in 谓词非常方便好用,而且代码也比较容易理解,所以使用非常频繁。但in却成为性能优化的瓶颈,本文通过示例给你详细说明。

示例数据及问题

员工参数课程培训数据,两次不同课程培训分别存在CLASS_A 和 CLASS_B 两张表中。

CLASS_A:

id(编号)name(名称)
1李承
2李莉
3李丽

CLASS_B:

id(编号)name(名称)
1李承
2李莉
4王欣

问题:
查找同时参加了两门课程的员工。

两种方式实现

下面分别使用in 和 exists两种方式实现。

in 方式查询

SELECT *
FROM class_a
WHERE id IN ( SELECT id FROM class_b);

exists 方式查询

SELECT *
FROM class_a A
WHERE EXISTS  ( 
    SELECT * 
    FROM class_b B
    WHERE A.id = B.id
);

分析

上述两种方法查询结果一样,但exists 方式速度要快。分析如下:

  • 如果连接列id 上有索引,那么查询CLASS_B时,无需查询实际表,仅需要查索引就可以了。
  • 使用exists ,那么只有查到一行数据满足条件就会终止查询,不会产生临时表。
  • 使用in查询时,数据库首先会执行子查询,然后将结果保存在临时表中,然后扫描整个临时表,很多情况下非常耗费资源。

总结

exists 方式查询 比 in 方式查询效率高,但in 可读性较好。建议尽可能使用exists方式,避免使用子查询,除非in 的参数为数值列表。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值