Cor*_*999 5 mysql database performance structure
我只想在MySQL中找到一个数据库结构,以获取所有用户朋友的朋友以及相应的查询来检索它们.(朋友链接是双向的)
我找到了几个与此相关的帖子,但我担心的是性能:
很多帖子都建议一个结构,你有一个表,其中每一行代表一个友情链接,例如:
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万行.
如果我可以使用这样的结构:
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)
编辑:抱歉,我刚刚醒来,在发布回复后意识到这根本不是您想要的。抱歉。