我设置的用户关系表看起来像这样。
现在说我要检查一个关系,看看它是否存在于两个用户之间,他们可以说这个例子是ID 1&我可以做一个:
SELECT *
FROM user_relationship
WHERE (requesting_user_id='1' AND requested_user_id='2')
|| (requesting_user_id='2' AND requested_user_id='1')
但我想知道他们是否有更好的方法来做到这一点?
答案 0 :(得分:3)
OR是众所周知的糟糕表现者。你可以试试UNION:
SELECT a.*
FROM USER_RELATIONSHIP a
WHERE a.requesting_user_id = '1'
AND a.requested_user_id = '2'
UNION
SELECT b.*
FROM USER_RELATIONSHIP b
WHERE b.requesting_user_id = '2'
AND b.requested_user_id = '1'
UNION将删除重复项; UNION ALL
不会(并且速度更快)。
如果有任何列回来而你没有使用 - 它们不应该在查询中。
索引应该是:
...要么是单独的,要么是单一的复合索引,但你必须测试才能知道哪种方法效果最好。
答案 1 :(得分:0)
如果您认为用户无法向自己发送请求,则这应该是等效的:
SELECT *
FROM user_relationship
WHERE requesting_user_id IN(1, 2) AND requested_user_id IN(1, 2);
我怀疑这实际上会更快,但至少更容易阅读(在我看来)。
确保您拥有一个涵盖requests_user_id和requested_user_id的索引 - 如果您经常执行此查询,那么这样的索引绝对是必需的。