我有以下表格。所有字段均为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
答案 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,那就是您给我的关于您的数据模型的印象。