2017-05-04 250 views
1

我使用下面的查詢取朋友關係:的Mysql 5.7慢CASE WHEN然後查詢

SELECT F.friend_one, F.friend_two, F.requested_id, F.status 
FROM users U, friends F 
WHERE 
CASE 
WHEN F.friend_one = 2 
THEN F.friend_two = U.id 
WHEN F.friend_two= 2 
THEN F.friend_one= U.id 
END 
AND F.status = 1 

http://www.9lessons.info/2014/03/facebook-style-friend-request-system.html

Table Structure

但是,選擇從朋友表的結果與7500點的記錄發生1.5秒。有沒有辦法解決這個問題?我不是sql的專家。解釋表明我正在做所有選擇我認爲會造成麻煩的事情。

Explain

回答

2

你跟unionunion allon子句中使用orcase可能會更好過:

SELECT F.friend_one, F.friend_two, F.requested_id, F.status 
FROM users U JOIN 
    friends F 
    ON F.status = 1 AND F.friend_one = 2 AND F.friend_two = U.id 
UNION ALL 
SELECT F.friend_one, F.friend_two, F.requested_id, F.status 
FROM users U JOIN 
    friends F 
    ON F.status = 1 AND F.friend_two = 2 AND F.friend_one= U.id; 

您可能還需要有索引。我會推薦friends(status, friend_two, friend_one)friends(status, friend_one, friend_two)

+0

Thanks @Gordon。還有一個問題。索引關鍵問題中的列順序?或者它只是一種緣故或可讀性。附:所以說我不能太快接受答案!當我允許時,我會接受它:)歡呼! – Inacio

+1

@Inacio。 。 。索引中鍵的順序很重要,這就是爲什麼這個答案建議兩個不同的索引。 –

+0

謝謝!接受的答案:) – Inacio