MySQL:左外部联接和内部联接之间哪个联接更好


10

如果所有连接都提供相同的结果,哪个连接比较好执行?例如,我有两个表employees(emp_id,name, address, designation, age, sex)work_log(emp_id,date,hours_wored)。为了得到一些特定的结果,inner joinleft join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。

  • 在结果值相同的情况下,哪个连接更有效?
  • 申请加入时还必须考虑哪些其他因素?
  • 内部联接和交叉联接之​​间有什么关系吗?

Answers:


14

没有“更好”或“更差”的联接类型。它们具有不同的含义,因此必须根据它们使用。

在你的情况,你可能不会有任何work_log员工(该表中没有行),所以LEFT JOINJOIN会在结果等同。但是,如果您有这样的事情(没有注册work_log的新雇员),则将JOIN省略该雇员,而左联接(其第一个表是雇员)将显示所有这些雇员,如果存在,则在work_log的字段中为null不匹配。

可视化的JOIN类型

同样,性能是查询正确性的第二要务。有人说您不应使用LEFT JOIN。的确,LEFT JOIN会强制优化器以一种特定顺序执行查询,从而在某些情况下阻止某些优化(表重新排序)。这是一个例子。但是,如果牺牲了正确性/含义,则不应选择一个,因为INNER JOIN本质上不会更糟。其余的常规优化将照常应用。

总而言之,LEFT JOIN如果您确实要使用,请不要使用INNER JOIN

在MySQL中CROSS JOININNER JOINJOIN相同。在标准中,从语义上讲,a CROSS JOININNER JOIN不带ON子句的,因此您可以获取表之间行的所有组合。

您可以在Wikipedia上找到有关连接的所有语义类型的示例。实际上,在MySQL中,我们倾向于只编写JOINLEFT JOIN


1
Gr8解释@jynus。幸运的是,我仅从您那里得到了我的问题的答案。
ursitesion

1个相关图形优于1000个字。你做了吗?
Fr0zenFyr

不,我没有,署名在图像codeproject.com/Articles/33052/的底部。-尽管使用维恩图表示联接与代数形式化一样古老:en.wikipedia.org/wiki/Relational_algebra
jynus

我从一组评论开始,然后才意识到一切都取决于-您的查询。向我+1!
iheanyi


0

如果所有联接都提供相同的结果,哪个联接的性能更好?

我除了前面的答案外,就我所知,MySQL已优化为具有相同的性能。

例如,有了良好的索引,要过滤的JOINvs LEFT JOIN+ WHERE子句将是同一回事。优化人工阅读在具有大量联接的大型查询中很有意义。

使用良好的索引和缓存更为重要。

您可以在此处阅读有关优化过程的详细说明:

查询优化过程查询通常可以以多种不同的方式执行并产生相同的结果。优化器的工作是找到最佳选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.