我试图理解 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/