mysql - SQL:特定情况下 INNER JOIN 和 INNER SELECT 之间的区别

标签 mysql sql oracle

我开始学习 SQL。而且我发现我们经常可以在 JOIN 或内部选择语句的帮助下获得相同的结果。

问题 1(广泛):JOIN 在哪里比内部选择更快,反之亦然?

问题 2(窄):您能解释一下是什么导致了以下三个查询的性能差异吗?

P.S.very nice site它计算查询性能,但我无法理解它的估计结果。

查询 1:

SELECT DISTINCT maker 
FROM Product pro INNER JOIN Printer pri
on pro.model = pri.model

查询2:

SELECT DISTINCT maker
FROM Product 
WHERE model IN (
  SELECT model FROM Printer
)

查询 3:

SELECT distinct maker 
FROM Product pro, Printer pri 
WHERE pro.model = pri.model

最佳答案

当服务器评估 JOIN 时,它匹配连接等价性,仅扫描其他表中的值所需的列,并过滤掉其他所有内容,这通常是通过特定操作完成的。
当你有一个子查询时,服务器需要在 JOIN 等价匹配之前评估子查询的计划,所以如果子查询不能弥补过滤掉大量噪音的额外努力,那么没有它你会有更好的性能。

服务器非常聪明,他们会尝试去除评估连接时不需要的所有内容。然后,他们尝试使用他们可以使用的每个索引来获得最佳性能,其中最佳性能意味着他们可以在有限的时间内找到最好的,这样计划时间本身就不会破坏性能。

在OP评论后添加
O(n) 估计取决于查询和子查询的复杂性,如果您对查询计划构建感兴趣,您将不得不浏览所选数据库的帮助部分,并且可能找不到很多,如果数据库不是开源的。
通俗地说:

  • a 简单联接在一个级别上进行评估,即主要查询计划
  • 子查询在子查询计划和主查询计划这两个级别上进行评估。

一些 DB IDE 可以显示总体计划的可视化表示,这通常有助于理解其中的一些要点(我不知道 mySQL 是否有)

关于mysql - SQL:特定情况下 INNER JOIN 和 INNER SELECT 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23008108/

相关文章:

php - 在 wp_Query 的 $args 中执行错误的关系值?

mysql - 简单的 MySQL if 查询语法

oracle - 为什么 oracle 连接在 mac os sierra 上打开这么慢?

asp.net - 测试 Oracle 存储过程的最简单方法

c# - 远程MySQL访问耗时较长

mysql - 哪一个运行起来更安全/更好?

mysql - 列出mysql中所有表的序列号

MySQL - 根据从表 X 中删除的结果从表 Y 中删除

mysql - 使用 WHERE IN 子句的 SQL 更新查询可能包含大量不匹配的行 ID 是否会成为性能问题?

sql - 使用 DBMS_JOB 在 Oracle 中创建作业