我试图了解MySQL中EXISTS和ALL之间的区别。让我举个例子:
SELECT *
FROM table1
WHERE NOT EXISTS (
SELECT *
FROM table2
WHERE table2.val < table1.val
);
SELECT *
FROM table1
WHERE val <= ALL( SELECT val FROM table2 );
来自MySQL文档的引用:
传统上,EXISTS子查询以SELECT *开头,但它可以 从SELECT 5或SELECT column1开始,或任何东西。 MySQL的 忽略这样一个子查询中的SELECT列表,所以没有区别。 [1]
读到这一点,在我看来,mysql应该能够将两个查询转换为相同的关系代数表达式。两个查询只是两个表中的值之间的简单比较。但是,情况似乎并非如此。我尝试了两个查询,第二个查询比第一个更好。
答案 0 :(得分:1)
您问题中的查询不等同,因此无论他们的优化程度如何,他们都会有不同的执行计划。如果您使用NOT val > ANY(...)
,则它将是等效的。
您应始终使用EXPLAIN
查看查询的执行计划,并意识到执行计划可能会随着数据的变化而变化。测试和理解执行计划将帮助您确定哪些方法表现更好。 ALL / ANY / SOME没有严格的规则,而且它们经常被优化到一个EXISTS。