EXISTS vs ALL,ANY,SOME

时间:2015-03-10 07:02:31

标签: mysql sql database relational-algebra

我试图了解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应该能够将两个查询转换为相同的关系代数表达式。两个查询只是两个表中的值之间的简单比较。但是,情况似乎并非如此。我尝试了两个查询,第二个查询比第一个更好。

  • 优化程序如何准确处理此查询?
  • 为什么优化器不能将第一个查询作为第二个查询执行?
  • 使用ALL / ANY / SOME条件总是更有效吗?

1 个答案:

答案 0 :(得分:1)

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

您应始终使用EXPLAIN查看查询的执行计划,并意识到执行计划可能会随着数据的变化而变化。测试和理解执行计划将帮助您确定哪些方法表现更好。 ALL / ANY / SOME没有严格的规则,而且它们经常被优化到一个EXISTS。