与交叉连接相比,内连接的性能

时间:2009-03-22 13:06:14

标签: sql performance

发出内部联接的效果与在WHERE子句中使用联接条件声明交叉联接相同。我注意到我公司的很多人使用交叉连接,我会使用内部连接。在更改了一些查询之后,我没有注意到任何显着的性能提升,并且想知道这是否只是巧合,或者DBMS是否透明地优化了这些问题(在我们的案例中是MySql)。这是一个讨论的具体例子:

SELECT User.*
FROM User, Address
WHERE User.addressId = Address.id;

SELECT User.*
FROM User
INNER JOIN Address ON (User.addressId = Address.id);

10 个答案:

答案 0 :(得分:47)

交叉连接生成的结果包含来自两个或多个表的每个行的组合。这意味着如果表A有6行而表B有3行,则交叉连接将产生18行。这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合。

使用内部联接,表中一行的列值与另一行(或同一)表的另一行中的列值组合,形成一行数据。

如果将WHERE子句添加到交叉连接中,则它将作为内连接运行,因为WHERE强加了限制因子。

只要您的查询遵守常识和特定于供应商的performance guidelines,我就会想到决定使用哪种类型的联接作为一个简单的品味问题。

答案 1 :(得分:23)

除了内连接更清晰之外没有区别,因为它定义了连接,使where子句成为实际的限制条件。

答案 2 :(得分:14)

使用EXPLAIN查看两个查询的查询计划,并查看是否存在任何差异。很可能MySQL在两种情况下都会使用相同的执行计划。我使用INNER JOIN语法主要是因为它更清晰。

答案 3 :(得分:10)

我发现允许第一种语法(以逗号分隔的表)的工作场所往往会占用大量时间来调试返回比预期更多行的情况。无意的交叉连接是系统的祸根,甚至可以将最精心调整的数据库带到它的膝盖上。它使我们的预制系统在去年至少两次戛然而止。

第二种语法(连接语法)强制编写者首先考虑如何将表连接在一起,然后仅返回有趣的行。使用这种语法不可能意外地进行交叉连接,因此减少了意外性能低下的查询的危险。

然而,除了这个问题之外,我从来没有注意到我所拥有的任何系统中两种语法之间存在任何速度差异。

答案 4 :(得分:2)

第一个示例在功能上与第二个示例相同。但是,出于多种原因应避免使用此语法。首先,在使用此语法时,特别是当表中存在多个连接时,更容易意外地获得交叉连接。如果你看到很多这种类型的查询使用关键字distinct,你可能有人试图修复交叉连接。

接下来,不推荐使用旧版式的左右连接语法,将不再支持该语法。而且,无论如何它现在都无法正常工作。有时它会错误解释外连接并发回错误的结果集。所以你在where子句中使用 =或= 的任何查询都应该立即被替换。

第三,ANSI标准连接更容易理解和维护。了解联接是任何查询任何关系数据库所需的最关键的基本技能之一。根据我的经验,一些使用较旧风格的人并不真正了解联接及其工作方式,因此编写的查询实际上并没有达到预期目的。

答案 5 :(得分:1)

您加入表格的顺序或放置ON / WHERE条件无关紧要。

查询优化器应该优化并使用最佳顺序(并选择如何最好地过滤数据,从哪里开始等)

尽管如此,我建议使用INNER JOIN语法,因为它使事情更具可读性,使用LEFT或FULL连接的语法也更加透明。

这里有一些更多关于它的文字:http://linus.brimstedt.se/?/article/articleview/SQL语法

/ B

答案 6 :(得分:1)

第一种语法的另一个好处是,在限制条件下,您可以更加通用。不只是平等。

但是如果你使用相等,为什么要信任优化器呢?确保它不会首先生成交叉连接,然后消除行。使用第二个。

答案 7 :(得分:0)

SQL Server说“当WHERE将交叉连接转换为内部连接时”, 所以没有区别。 http://msdn.microsoft.com/en-us/library/ms190690.aspx

我做了SQL服务器“执行计划”,性能相同。

答案 8 :(得分:0)

解释两个查询都会给出相同的输出

-server

但是使用内连接语法是更好的选择,因为它更清晰,更精确。 与Cross Join相比,Mysql可以在内部调整Left和Right连接查询以选择更少的数据。

答案 9 :(得分:-1)

从一开始,优化器就是围绕经典的restrict-project-cartesian产品语法构建的。实际上,所有供应商都复制了System R开创的设计。然后,供应商采用“最新和最好的”ANSI语法并改进了他们的SQL执行引擎。与营销手册可以告诉你的相反(“使用最新的语法”),物理实现级别上没有太多改变:它仍然是[索引]嵌套循环,或散列或排序合并连接。因此,没有理由假设一种语法优于另一种语法。

就我个人而言,新语法为redundant,嘈杂,inconsistent。至于被委员会批准,“走进每个城市的任何公园,你都找不到委员会的雕像”。