https://www.toutiao.com/article/7532431152603398671
在 SQL 查询中,很多人习惯用 IN 来筛选 “存在于某个集合中的数据”,但当数据量增大时,IN 的效率会急剧下降。今天揭秘一个性能优化神器 ——EXISTS 函数,用对了能让查询速度提升数倍。
假设有两张表:orders(订单表)和refund_orders(退款订单表),我们需要查询 “有过退款记录的订单信息”。
如果用 IN 查询,代码是这样的:
SELECT *
FROM orders
WHERE order_id IN (SELECT order_id FROM refund_orders);
而用 EXISTS 改写后:
SELECT *
FROM orders o
WHERE EXISTS (
SELECT 1 FROM refund_orders r
WHERE r.order_id = o.order_id
);
两者查询结果相同,但原理大不相同:IN 会先执行子查询并生成一个临时集合,再逐条比对主表数据;而 EXISTS 一旦找到匹配的记录就会停止搜索,相当于 “短路判断”,尤其在子查询数据量大时,效率差异会非常明显。
这类场景闭眼用,效率直接翻倍
子查询返回的结果集较大(超过 1 万条)时,EXISTS 的 “短路机制” 能减少大量无效比对;
主表有索引而子表无索引时,EXISTS 对主表的遍历更高效;
需要判断 “是否存在关联记录” 而非 “获取具体关联数据” 时,EXISTS 是更优选择;
多表关联查询中,用 EXISTS 替代 IN 可避免因数据重复导致的结果集膨胀。
你在实际开发中,有没有对比过 IN 和 EXISTS 的性能?还遇到过哪些让查询效率大幅提升的小技巧?欢迎在评论区分享你的发现!
文档更新时间: 2025-07-31 07:21 作者:admin