为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标琳琳 2019-11-13 14:09:56
发出内部联接的效果与在WHERE子句中说明具有联接条件的交叉联接相同。我注意到公司中许多人使用交叉联接,而在内部交叉联接中使用内部联接。更改其中一些查询后,我没有发现任何显着的性能提升,并且想知道这是否只是巧合,还是DBMS是否透明地优化了此类问题(在我们的案例中为MySql)。这里是一个具体的讨论示例:SELECT User.*FROM User, AddressWHERE User.addressId = Address.id;SELECT User.*FROM UserINNER JOIN Address ON (User.addressId = Address.id);
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

交叉联接产生的结果由两个或多个表中的行的每种组合组成。这意味着如果表A有6行,表B有3行,则交叉连接将导致18行。在两个表之间没有建立关系-实际上,您只是产生每种可能的组合。


通过内部联接,将表的一行的列值与另一(或同一)表的另一行的列值组合在一起,以形成单行数据。


如果将WHERE子句添加到交叉联接中,则由于WHERE施加了限制因素,因此它充当内部联接。


只要您的查询遵守常识和特定于供应商的性能准则,我就认为将使用哪种类型的连接的决定简单地考虑进去。


查看完整回答
反对 回复 2019-11-13
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我发现,允许第一种语法(用逗号分隔的表)的工作场所往往会花费大量时间来调试情况,这些情况下返回的行比预期的多。意外的交叉联接是系统的祸根,甚至可以使最优化的数据库瘫痪。去年,它至少使我们的pre-prod系统停止了两次。

第二种语法(联接语法)迫使编写者首先考虑如何将表联接在一起,然后仅返回感兴趣的行。使用该语法意外地进行交叉联接是不可能的,因此减少了意外地执行不良查询的危险。

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


查看完整回答
反对 回复 2019-11-13
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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

接下来,不赞成使用较旧样式的左右联接语法,并且将不再支持该语法。此外,它现在仍然无法正常工作。有时,它会误解外部联接并发回错误的结果集。因此,您在where子句中使用=或=的所有查询都应立即替换。

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


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 816 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信