2

我正在制作一个用户可以互相关注的 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)
);
4

1 回答 1

3

假设“最佳”是指性能最高的,并且考虑到必须是相互的,才能满足“朋友”标准:

使用过滤器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 将默认使用您的主键作为聚集索引,在这种情况下,它确实非常重要。)

于 2012-06-17T15:47:02.023 回答