LEFT JOIN或INNER JOIN?

时间:2016-01-08 07:13:41

标签: mysql

我有以下表格。所有字段均为NOT NULL

tb_post
    id
    account_id
    created_at
    content

tb_account
    id
    name

我想选择最新的帖子和名字。我应该使用INNER JOIN还是LEFT JOIN?根据我的理解,两者产生相同的结果。但哪个更正确或更快?

SELECT p.content, a.name
FROM tb_post AS p
[INNER or LEFT] JOIN tb_account AS a
ON a.id = p.account_id
ORDER BY p.created_at DESC
LIMIT 50

4 个答案:

答案 0 :(得分:1)

LEFT JOIN绝对不比INNER JOIN快。事实上,它更慢;根据定义,外部联接(LEFT JOIN或RIGHT JOIN)必须完成INNER JOIN的所有工作以及对结果进行null扩展的额外工作。由于结果集的大小较大,预计还会返回更多行,从而进一步增加总执行时间。

(即使LEFT JOIN由于某些难以想象的因素汇合而在特定情况下更快,但它在功能上并不等同于INNER JOIN,因此您不能简单地将其中一个实例替换为另一个实例!)

最好选择INNER JOIN。

答案 1 :(得分:0)

根据我的观点,正确的一个是内部联接

  

因为它返回的结果集只包含匹配的元素,其中Left Join返回Left Table中的所有条目。在这种情况下,我认为Inner join返回唯一需要处理的数据量。

答案 2 :(得分:0)

你必须问自己两个问题。

1)是否有可能在您的申请生命周期的某个时间点,会有空的或无效的帖子account_id

如果没有,那没关系。

如果是的话......

2)是否需要在查询结果中包含没有关联帐户的帖子?如果是,请使用LEFT JOIN,如果不是,请使用INNER JOIN。

答案 3 :(得分:0)

我个人并不认为速度是非常相关的:它们之间的区别就在于它们的作用。

他们碰巧在你的情况下给出相同的结果,但这并不意味着他们可以互换,因为选择其中一个仍然告诉另一个人读取你的代码。

我倾向于这样想: INNER JOIN - 两个表基本上是一组,我们只需要结合两个来源。 LEFT JOIN - 左表是来源,我们可以选择附加信息(在右表中)。

因此,如果我阅读您的代码并看到LEFT JOIN,那就是您给我的关于您的数据模型的印象。