【问题标题】:EXISTS vs ALL, ANY, SOME存在与所有,任何,一些
【发布时间】:2015-03-10 07:02:31
【问题描述】:

我试图了解 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 条件总是更有效吗?

【问题讨论】:

标签: mysql sql database relational-algebra


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多