我正在创建一个用户可以互相关注的SNS。如果用户A跟随用户B而用户B也跟随用户A,则他们变为朋友。
还要考虑一些受欢迎的人(如电影明星)可能会跟随数十万次,但用户最多可以跟踪1000人。
因此,根据下表,获取用户1的所有朋友ID的最佳SQL查询是什么?
PS:我正在使用MySQL 5.5。
这是我到目前为止所做的:
SELECT followee_id AS friend_id FROM follow
WHERE follower_id = 1 AND
followee_id IN (SELECT follower_id FROM follow
WHERE followee_id = 1);
CREATE TABLE follow
(
follower_id INT UNSIGNED NOT NULL,
followee_id INT UNSIGNED NOT NULL,
PRIMARY KEY (follower_id, followee_id),
INDEX (followee_id, follower_id)
);
答案 0 :(得分:2)
假设“最好”的意思是最有效的,并且考虑到以下必须是相互的,以满足您的“朋友”标准:
使用followee_id
的过滤器会比follower_id
上的过滤器更好地命中您的索引
select
me.follower_id
from
follow me inner join
follow you
on
me.follower_id = you.followee_id
and me.followee_id = you.follower_id
where
me.followee_id = @user
(虽然请注意,RDBMS就像MSSQL一样,默认使用你的主键作为聚集索引,在这种情况下它真的很多。)