MySQL检索朋友结构和性能的朋友

Cor*_*999 5 mysql database performance structure

我只想在MySQL中找到一个数据库结构,以获取所有用户朋友的朋友以及相应的查询来检索它们.(朋友链接是双向的)

我找到了几个与此相关的帖子,但我担心的是性能:

结构1

很多帖子都建议一个结构,你有一个表,其中每一行代表一个友情链接,例如:

    CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL,
    `friend_id` int(10) unsigned NOT NULL,
    )
Run Code Online (Sandbox Code Playgroud)

说用户'1'有三个朋友'2','3','4',用户'2'有两个朋友'1','5'.你的朋友表看起来像这样:

    user_id    |    friend_id
    1          |    2
    1          |    3
    1          |    4
    2          |    1
    2          |    5
Run Code Online (Sandbox Code Playgroud)

朋友的朋友查询:如何选择朋友的朋友可以在这里看到SQL获取用户朋友和朋友的朋友.用户'1'的查询的结果应该给(1,2,3,4,5)

我担心:平均fb用户有大约140个朋友.频繁的用户将拥有更多.如果我有20,000个用户,那么最终将至少有300万行.

结构2

如果我可以使用这样的结构:

    CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL,
    `friend_1` int(10) unsigned NOT NULL,
    `friend_2` int(10) unsigned NOT NULL,
    `friend_3` int(10) unsigned NOT NULL,
    `friend_4` int(10) unsigned NOT NULL,
    ....
    )
Run Code Online (Sandbox Code Playgroud)

我的表看起来像这样(从上面举例):

    user_id  |  friend_1  |  friend_2  |  friend_3  |  ...
    1        |  2         |  3         |  4         |
    2        |  1         |  5         |            |...
Run Code Online (Sandbox Code Playgroud)

现在我只有20.000行.

朋友的朋友查询:选择朋友的朋友我试过

    Select * FROM friends as a
    WHERE a.user_id 
    IN (
        SELECT * FROM friends AS b
        WHERE b.user_id = '1'
    )
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误"#1241 - 操作数应该包含1列".我认为问题是,子选择传递的是一行,而不是一列?

问题

我希望你理解我的担忧.对于这些问题的任何输入,我真的很高兴

1) 找到一个查询,返回结构2中指定用户的所有朋友的朋友?

2) 哪种结构可以让我更快地回复朋友的朋友?结构2中,我认为"连接 "可能很慢,如果它甚至可以在这里使用连接.谢谢你的任何建议.如果您能想到任何其他结构,也许可以利用小世界网络类型,我很乐意听到它们.

谢谢!!

小智 2

我想说你应该使用第一个结构。我认为它更灵活。我的查询解决方案是一个简单的子查询,如下所示:

SELECT friend_id FROM friends WHERE user_id IN (

       SELECT friend_id FROM friends WHERE user_id='$USER_ID'

);
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉,我刚刚醒来,在发布回复后意识到这根本不是您想要的。抱歉。