VIDTAKER.COM

Q&A

どのように速く実行するために、このクエリを最適化できますか?


これは他の各ISの友達、ユーザーがし、友達、サイト私moduleこれらのサービスは、友だち"stored:"の表を、物事との終わりをperson deny人に承認/開始しfriendship_inviter being友情をfriendhsip_accepterです

SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON (   users.user_id = friends.friendship_inviter 
        OR users.user_id = friends.friendship_accepter)
WHERE (friendship_inviter = '125' OR friendship_accepter = '125') 
AND    user_id !='125' 
AND    friendship_level = 1;

これは完全な表は、にもかかわらず、テーブルが大きい(15,000ユーザー、3000友情)は、平均で1〜1.5秒しかかかりませんされていませんスキャンしません。

以下の課税nサーバになる方法ではどのようにすれば、出力電流の友達このリストを?



5 Replies

1)

SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON users.user_id = friends.friendship_accepter
WHERE  friendship_accepter = '125' 
AND    user_id !='125' 
AND    friendship_level = 1
UNION 
SELECT user_id, user_name, user_gender
FROM friends
LEFT JOIN users
    ON users.user_id = friends.friendship_inviter
WHERE friendship_inviter = '125'  
AND    user_id !='125' 
AND    friendship_level = 1;

あなたは"友人"からテーブルを何も選択されていませんのようなもちろん、それが見える、あなたのWHERE句での余分なカラムを持って、私は実際にその代わりに、その左JOINをに相当するの投稿の場合です内部結合を書いていたので、 :

SELECT user_id, user_name, user_gender
FROM friends
INNER JOIN users
    ON users.user_id = friends.friendship_accepter
WHERE  friendship_accepter = '125' 
AND    user_id !='125' 
AND    friendship_level = 1
UNION 
SELECT user_id, user_name, user_gender
FROM friends
INNER JOIN users
    ON users.user_id = friends.friendship_inviter
WHERE friendship_inviter = '125'  
AND    user_id !='125' 
AND    friendship_level = 1;

2)

列/組み合わせWHERE句で使用されて参加するためにインデックスを追加します。


3)

あなたがいることを確認user_id, friendship_accepter, friendship_inviter and friendship_levelインデックス。

また、あなただけの生のクエリ時間を投稿してその時、またはそれが結果の出力までの時間が含まれてですか?それはまた、、出力が遅いクエリすることができないの出力が含まれる場合。

結果を減速する可能性がもう一つは、それが遅い(つまりインターネット)は、ネットワークを介してです。遅い時間はこれとていないため、クエリのためかもしれません。


4)

問題の一部は、friendship_level低濃度である可能性があります。場合によっては、低濃度の列に、クエリオプティマイザは、スキャンとにかくテーブルを行うことを決定する。

、EXPLAINを行い、その他の条件は最初、friendship_level条件クエリで考えられている前に実行していることを確認します。レコード最初の2つの条件がはるかに少ない時間がかかる満足している後に残りのスキャンします。


5)

私の社会的ネットワークのサイトは私に私が何か非常に非常に似て友情は少し挿入2レコードを各私は別の、これはユーザを許可見る私に。

要求を保留中の友達のリクエストを送信友達や友人を確認

I'tも、UNIONの使用を、何かを検討する必要がなくなります。私は現在、約50,000のユーザーを持ち、1万友人テーブル内の行の上、これはかなり私にとって良い作品