发出内连接的效果与在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);
karim79.. 53
交叉连接生成的结果包含来自两个或多个表的每个行的组合.这意味着如果表A有6行而表B有3行,则交叉连接将产生18行.这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合.
使用内部联接,表的一行中的列值与另一个(或相同)表的另一行中的列值组合以形成单行数据.
如果将WHERE子句添加到交叉连接,则它表现为内连接,因为WHERE强加了限制因子.
只要您的查询遵守常识和供应商特定的性能指南,我就会想到决定使用哪种类型的联接来做一个简单的品味问题.
交叉连接生成的结果包含来自两个或多个表的每个行的组合.这意味着如果表A有6行而表B有3行,则交叉连接将产生18行.这两个表之间没有建立任何关系 - 你实际上只是产生了所有可能的组合.
使用内部联接,表的一行中的列值与另一个(或相同)表的另一行中的列值组合以形成单行数据.
如果将WHERE子句添加到交叉连接,则它表现为内连接,因为WHERE强加了限制因子.
只要您的查询遵守常识和供应商特定的性能指南,我就会想到决定使用哪种类型的联接来做一个简单的品味问题.
除了内部连接更加清晰之外没有区别,因为它定义了连接,使where子句成为实际的限制条件.
使用EXPLAIN查看两个查询的查询计划,并查看是否存在任何差异.很可能MySQL在两种情况下都会使用相同的执行计划.我使用INNER JOIN语法主要是因为它更加清晰.
我发现允许第一种语法(逗号分隔表)的工作场所往往会占用大量时间来调试返回比预期更多行的情况.无意的交叉连接是系统的祸根,甚至可以将最精心调整的数据库带到它的膝盖上.它使我们的预制系统在去年至少两次戛然而止.
第二种语法(连接语法)强制编写者首先考虑如何将表连接在一起,然后仅返回有趣的行.使用这种语法不可能意外地进行交叉连接,因此减少了意外性能低下的查询的危险.
但是,除了这个问题之外,我从来没有注意到我所拥有的任何系统中两种语法之间存在任何速度差异.