2017-05-04 14 views
1

を照会すると、私は次のクエリを使用して友人関係を取得しています:のMySQL 5.7遅いCASE THEN

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

おそらくon句でorcaseを使用してよりunionまたは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_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

ありがとう@Gordon。もう1つの質問。索引キーの列の順序は重要ですか?それはちょうど酒や読みやすさです。 p.s. SOは、私はあまりにも早い回答を受け入れることができないと言います私はそれが受け入れるだろう:)歓声! – Inacio

+1

@Inacio。 。 。索引のキーの順序は重要です。そのため、この回答では2つの異なる索引が推奨されています。 –

+0

ありがとう!回答が受け入れられました:) – Inacio