性能最佳的MySql'Friend'表

时间:2012-05-11 22:53:31

标签: mysql join union

我在这个结构的社交网络上有一个朋友表:

uid binary(16) 
memberid int 
friendid int 
datefriended datetime 
isactive bool

这样我只将关系和其他数据存储在一个表中。但是说我需要得到我所有的朋友,无论我是朋友(memberid)还是我的朋友(friendid),然后我需要从成员表中获取用户名。查询是这样的:

SELECT m.name FROM members m
INNER JOIN friends f on m.memberid = f.friendid
WHERE f.memberid = 1

UNION ALL

SELECT m.name from members m
INNER JOIN friends f on m.memberid = f.memberid
WHERE f.friendid = 1

如果您有很多用户和朋友提取此数据,这对我来说似乎可能是对数据库的资源密集型调用。我知道可以选择为每个朋友关系提供一对条目,但我试图在一次查询中执行此操作。 您对如何改进查询或表结构以提高性能有任何想法吗?或者它可能不会像我预见的那样糟糕?

1 个答案:

答案 0 :(得分:5)

除了上面的评论建议您在friends.memberidfriends.friendidmembers.memberid上创建索引之外,您根本不需要UNION

SELECT m.name
FROM members AS m JOIN friends AS f
  ON (m.memberid, 1) IN ((f.friendid, f.memberid), (f.memberid, f.friendid))