我有一个查询来获取用户朋友的数据。我有 3 个表,一个是用户表,第二个是具有 user_id 和 friend_id 的 user_friend 表(两者都是用户表的外键(,第三个表是具有user_id和 Feed 内容的提要表。提要可以展示给朋友。我可以通过两种方式通过加入或使用IN
子句进行查询(我可以通过用于网络的图形数据库获取所有朋友的 ID(。
下面是两个查询:
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)
当我有数百万条记录时,哪个查询运行得更快且性能更好?
有了合适的索引,单查询JOIN
(选择 1(几乎总是比 2 查询(选择 2(算法运行得更快。
要优化选项 1,b
需要以下复合索引:INDEX(user_id, friend_id)
。 此外,a
需要一个以 user_id
开头的索引(大概是PRIMARY KEY
?
您希望的结果,当您在子查询中比较大数据时,在这种情况下,它们总是首选连接。因为子查询可能比 LEFT [OUTER] JOINS/INNER JOIN [LEft JOIN 比 INNER JOIN 快] 慢,但在我看来,它们的优势是可读性略高。
因此,如果您的数据具有较少的数据要比较,那么为什么选择完整的表联接,这取决于您拥有的数据量。
在我看来,如果你在IN
中比较的数据数量比它少,但如果你有子查询或大数据,那么你必须去join
......