Mysql内连接vs子句性能

时间:2017-12-28 07:03:57

标签: mysql performance join in-clause

我有一个查询来获取用户朋友的数据。我有3个表,一个是用户表,第二个是user_friend表,它有user_id和friend_id(都是用户表的外键),第三个表是带有user_id和feed内容的feed表。饲料可以显示给朋友。我可以通过加入或使用IN子句以两种方式进行查询(我可以通过图形数据库获取所有朋友'我用于网络)。

以下是两个问题:

SELECT
  a.*
FROM feed a
INNER JOIN user_friend b ON a.user_id = b.friend_id
WHERE b.user_id = 1;

在此查询中,我从图形数据库中获取朋友ID并将传递给此查询:

SELECT
 a.*
FROM feed a
WHERE a.user_id IN (2,3,4,5)

当我有数百万条记录时,哪个查询运行速度更快,性能更好?

2 个答案:

答案 0 :(得分:0)

这取决于您在子查询中比较大数据时所需的结果,对于这些条件,它总是更喜欢连接。因为子查询可能比 LEFT [OUTER] JOINS / INNER JOIN [LEft JOIN比INNER JOIN快] 慢,但在我看来,他们的优势是可读性略高。

因此,如果您的数据比较少,那么您选择完整的表连接的原因取决于您拥有的数据量。

在我看来,如果您在 IN 中的比较数据的数量少于它的好,但如果您有子查询或大数据,那么您必须选择 join ...

答案 1 :(得分:0)

使用合适的索引,单查询JOIN(选择1)几乎总是比2查询(选择2)算法运行得快。

要优化选择1,b需要此综合索引:INDEX(user_id, friend_id)。另外,a需要一个以PRIMARY KEY开头的索引(大概是user_id?)。