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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/neweastsun/article/details/82960859

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 的参数为数值列表。

猜你喜欢

转载自blog.csdn.net/neweastsun/article/details/82960859