技巧——使用exists 代替 in"/>
SQL优化必知技巧——使用exists 代替 in
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 BWHERE A.id = B.id
);
分析
上述两种方法查询结果一样,但exists 方式速度要快。分析如下:
- 如果连接列id 上有索引,那么查询CLASS_B时,无需查询实际表,仅需要查索引就可以了。
- 使用exists ,那么只有查到一行数据满足条件就会终止查询,不会产生临时表。
- 使用in查询时,数据库首先会执行子查询,然后将结果保存在临时表中,然后扫描整个临时表,很多情况下非常耗费资源。
总结
exists 方式查询 比 in 方式查询效率高,但in 可读性较好。建议尽可能使用exists方式,避免使用子查询,除非in 的参数为数值列表。
更多推荐
SQL优化必知技巧——使用exists 代替 in
发布评论