存在与所有、任何、某些

EXISTS vs ALL, ANY, SOME

我试图理解 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 文档:

Traditionally, an EXISTS subquery starts with SELECT *, but it could begin with SELECT 5 or SELECT column1 or anything at all. MySQL ignores the SELECT list in such a subquery, so it makes no difference. [1]

读到这里,在我看来 mysql 应该能够将两个查询转换为相同的关系代数表达式。这两个查询都只是两个表中值之间的简单比较。然而,情况似乎并非如此。我尝试了两个查询,第二个查询的性能比第一个好得多。

您问题中的查询并不等同,因此无论优化程度如何,它们都会有不同的执行计划。如果你使用 NOT val > ANY(...) 那么它是等价的。

您应该始终使用 EXPLAIN 查看查询的执行计划,并意识到执行计划会随着数据的变化而变化。测试和理解执行计划将帮助您确定哪些方法执行得更好。 ALL/ANY/SOME 没有硬性规定,它们通常被优化为 EXISTS。