Mysql 使用联接而不是子查询
我有一个使用子查询的简单查询:Mysql 使用联接而不是子查询,mysql,sql,join,Mysql,Sql,Join,我有一个使用子查询的简单查询: SELECT pictures.* FROM pictures WHERE pictures.user_id IN (SELECT follows.following_id FROM follows WHERE follows.follower_id = 9) ORDER BY created_at DESC LIMIT 5; 我在想, a) 我如何删除子查询并使用联接来代替子查询?b)使用联接代替子查询会有性能优势吗 (follow
SELECT pictures.*
FROM pictures
WHERE pictures.user_id IN
(SELECT follows.following_id
FROM follows
WHERE follows.follower_id = 9)
ORDER BY created_at DESC LIMIT 5;
我在想,
a) 我如何删除子查询并使用联接来代替子查询?b)使用联接代替子查询会有性能优势吗
(follows.following\u id、follows.follower\u id、pictures.user\u id均已编制索引)
谢谢
要进一步了解加入的更多信息,请访问以下链接:
EXISTS
SELECT *
FROM pictures
WHERE EXISTS
(
SELECT 1
FROM follows
WHERE pictures.user_ID = follows.following_id AND
follows.follower_id = 9
)
ORDER BY pictures.created_at DESC
LIMIT 5
要进一步了解加入的更多信息,请访问以下链接:
EXISTS
SELECT *
FROM pictures
WHERE EXISTS
(
SELECT 1
FROM follows
WHERE pictures.user_ID = follows.following_id AND
follows.follower_id = 9
)
ORDER BY pictures.created_at DESC
LIMIT 5
谢谢为什么内部连接?为什么不使用外部左联接?
左联接
将返回表图片中的所有记录
所有不匹配的记录将在表后面的列上具有null
值。但由于已根据表中的列进行筛选,因此内部联接中的结果将相同,因为它将只返回与条件匹配的记录<代码>空
记录被删除。尝试执行LEFT JOIN
,您将得到相同的结果。谢谢!为什么内部连接?为什么不使用外部左联接?左联接
将返回表图片中的所有记录
所有不匹配的记录将在表后面的列上具有null
值。但由于已根据表中的列进行筛选,因此内部联接中的结果将相同,因为它将只返回与条件匹配的记录<代码>空
记录被删除。尝试执行LEFT JOIN
,您将得到相同的结果。为什么要删除子选择?使用联接的查询返回与子选择完全不同的结果,您需要使用JW的答案中的distinct
,将联接结果减少到使用子选择的查询结果中。我怀疑这会更快。。要回答b),您必须使用数据集测试这两个版本。@a_horse_和_no_名称我使用了jw答案中的内部联接。它以0.5-1ms的时间给我结果,而子查询则以4.5-7.5ms的时间给我结果。@0xSina:如果没有得到正确的结果,时间是无关的。我只是想指出你需要小心。您不能总是用联接替换子查询。@a_horse_和_no_name啊感谢您指出这一点!我需要学习更多关于加入的知识。你能告诉我为什么需要distinct吗?是否因为可能返回多个与联接完全相同的行?为什么要删除子选择?使用联接的查询返回与子选择完全不同的结果,您需要使用JW的答案中的distinct
,将联接结果减少到使用子选择的查询结果中。我怀疑这会更快。。要回答b),您必须使用数据集测试这两个版本。@a_horse_和_no_名称我使用了jw答案中的内部联接。它以0.5-1ms的时间给我结果,而子查询则以4.5-7.5ms的时间给我结果。@0xSina:如果没有得到正确的结果,时间是无关的。我只是想指出你需要小心。您不能总是用联接替换子查询。@a_horse_和_no_name啊感谢您指出这一点!我需要学习更多关于加入的知识。你能告诉我为什么需要distinct吗?是不是因为返回的多行可能与连接完全相同?