mysql - 存在与所有、任何、某些

标签 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 文档:

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

  • 优化器是如何准确处理这些查询的?
  • 为什么优化器不能让第一个查询像第二个查询一样执行?
  • 使用 ALL/ANY/SOME 条件总是更有效吗?

最佳答案

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

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

关于mysql - 存在与所有、任何、某些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28957830/

相关文章:

如果连接表中没有记录,mysql 结果

MySQL 查询优化,非常慢

sql - 累计计数

mysql - 我如何读取这个文本文件并插入到 MySQL 中?

mysql - SQL 存储函数出现问题,返回错误

php - 查询错误 (1052) : Column 'register_log_id' in field list is ambiguous

MySQL 查询平均日期范围

mysql - 生成 MySQL 插入并更改列名称

java - 带有 CONTAINS 查询的 PreparedStatement

php - 为上传的图片添加随机数前缀