我需要你帮我设计一个朋友系统
mysql表:
friends_列表
选项1=每当用户添加一个用户时,就有两个条目添加到DB中,然后我们就可以得到这样的朋友
SELECT user_id FROM `friends_list` WHERE friend_id='$userId' and approved_status='yes'
选项2=我们为添加的每个朋友添加1个条目,然后得到如下所示的好友列表
SELECT friend_id AS FriendId FROM `friends_list` WHERE user_id='$userId' and approved_status='yes'
UNION
SELECT user_id as FriendId FROM `friends_list` WHERE friend_id='$userId' and approved_status='yes'
在上面提到的在myspace、facebook这样的网站上交友的两种方法中,所有其他网站都这样做,以上两种方法中哪一种是最好的呢?
第一种方法使行数增加一倍,例如,有200万行朋友行的站点只会是第二个方法的100万行。
但是,union方法是否意味着有2个查询正在执行,所以在一个百万行表上有2个查询,而不是1个?
更新
我刚刚对6万名朋友进行了一些测试,这是结果,是的,表是索引的。
备选方案1,每个朋友有2个条目;
.0007秒
选项2,每个朋友使用UNION选择一个条目
.3100秒
发布于 2009-08-10 12:44:44
备选案文1。
尽可能多地增加一个朋友。和选择所有的朋友相比,增加一个人是非常罕见的。当你每次呈现一个页面(在社交网站上)时,可能会做一些事情。
发布于 2009-08-10 12:49:42
如果您是在user_id和friend_id上索引,那么这两个语句在时间上应该是等价的--尽管最好是测试-- DB的语句可能会有令人惊讶的结果。但是,数据库可以看到UNION,它可以使用它来优化查询。
友谊总是相互的,具有相同的认可地位吗?如果是的话,我会选择第二个。如果它可以是单程或单独批准,那么你需要第一个,对吗?
发布于 2009-11-10 21:01:53
您使用的是哪个dbms?在执行联合查询时,MySQL总是使用额外的临时表。创建这些临时表会给查询带来一些开销,这可能是联合查询比第一个查询慢的原因。
你有没有想过把朋友和朋友分开?这将减少“朋友”表的内容,还可以从“朋友请求”表中删除已接受的请求,并减小表的大小。另一个好的优点是,在每个表中保留较少的列,因此更容易在它们上获得一个优化的索引。
我目前正在构建这个特性自己,这将是一个有趣的了解您的经验在这个问题上。
https://stackoverflow.com/questions/1254630
复制相似问题