【发布时间】:2018-02-18 13:46:28
【问题描述】:
鉴于此示例表
+----+------+-----+--------+
| ID | Name | Age | Exempt |
+----+------+-----+--------+
| 1 | AA | 50 | FALSE |
| 2 | BB | 40 | FALSE |
| 3 | CC | 30 | FALSE |
| 4 | DD | 65 | TRUE |
| 5 | EE | 50 | FALSE |
| 6 | FF | 20 | FALSE |
+----+------+-----+--------+
还有这个查询
SELECT * FROM USERS
WHERE AGE > 40 AND EXPEMPT = TRUE;
有人告诉我,我可以使用子查询优化这个查询,但也可以使用这样的 IN 语句
SELECT * FROM USERS
WHERE AGE > 40 AND ID IN (SELECT ID
FROM USERS WHERE EXEMPT = TRUE);
这可行,但我不明白为什么第二个查询在性能上比第一个更好。
【问题讨论】:
-
对于
AND,所有行都必须评估WHERE条件。使用子查询,首先表被EXEMPT字段过滤,只有结果行(在这种情况下只有一行)进入“第二次运行”并且必须被AGE列过滤...这将提高性能,如果表有更多的行,比如几十万...... -
然而,
(EXEMPT, AGE DESC)上的索引将提供几乎一样多的性能提升... -
你的表有主键、索引吗?分享您的创建表语句
-
您在说什么 DBMS?执行计划在哪里?
-
“这是基于理论课”---那么这个问题没有答案:每个 DBMS(以及特定 DBMS 的每个版本)都有不同的性能特征。