gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:57 27 4
gpt4 key购买 nike

我开始学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com