mysql - 性能最好的 MySql 'Friend' 表

标签 mysql join union

我在用这种结构构建的社交网络上有一个 friend 表:

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

这样我就可以将关系和其他数据仅存储在一个表中。但是如果我需要获取我所有的 friend ,无论我是好友 (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

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

最佳答案

除了我上面建议您在 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))

关于mysql - 性能最好的 MySql 'Friend' 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10559546/

相关文章:

MySQL - 使用 Join 运算符后出现重复列

MySQL - 如何连接/联合这两个选择以进行单个查询?

mysql - 如何为我的nodejs项目创建mysql数据库?

php - 我有一个 SQL 连接。但是,我怎样才能只显示一次类别名称呢?

mysql - SQL错误日期与int不兼容

bash - 使用 join/awk/sed 合并 CSV 文件

sql - 错误: missing FROM-clause entry for table "p"

MySQL - 如何将列转为行?

mysql - 为多个更新查询创建存储过程

java - MySQL 更改表标题