mysql
  • sql
  • 2011-07-05 2 views 3 likes 
    3

    Tbl_responses 5,000のレコードがありますmysql Distinctを最適化する方法は?

    • ID
    • 応答
    • MSGID
    • ユーザ名

    を持っています。 800件の回答が "zac1987"によって投稿されました。 "zac1987"によって投稿された800件の回答のうち、msgidの違いが30件あります。

    SELECT DISTINCT msgid 
        FROM Tbl_responses 
    WHERE username = 'zac1987'; 
    

    現在、Explain SQLは800行が有効であることを示しています。 30行だけが有効になるようにクエリを最適化する方法は?私はループを避けるための解決策があると思う/ 800レコードをフィルタリング...ちょうど私のブログに表示されているJOIN句の問題とWHERE句を置き換えるのと同じように... ye5.blogspot.com/2011/07/optimize-faster-mysql-query-speed.html私はいくつかの専門家を避けるために800レコードをループします。

    私の他の質問 - なぜこのページhttp://forge.mysql.com/wiki/Top10SQLPerformanceTips「GROUP BYを使用しているときにDISTINCTを使用しないでください」と言っていると、クエリの処理速度が低下しますか?しかし、私はテストして、結果は遅くならなかった、なぜですか?

    SELECT msgid 
        FROM Tbl_responses 
    WHERE username = 'zac1987' GROUP BY msgid; 
    

    そして、いくつかの条件と同様に、ユーザー名= 'zac1987' AND ID = 'XYZ入れパフォーマンス

    +0

    私は理解していない、別れを意味し、グループバイは同じ時間を使用しますか? – Ibu

    +0

    私はページ上の文章も理解できません。同時に、distinctとgroupbyの両方を同時に使うことを意味すると思います... – zac1987

    +0

    あなたは一度に1つを使い、どちらが速いかを見てください。 – Ibu

    答えて

    2

    GROUP BY句を使用するクエリを書き換えてみてください' あなたの要件に応じてのみ、distinctとgroupを使用して行をフィルタリングすることができないためです。

    +0

    すでに試してみましたが、GROUP BYは800行に影響を受け、Distinctは800行にも影響を与えました。 GBとDistを組み合わせて使用​​すると、800行も影響を受けます。 – zac1987

    +0

    実際にここにパフォーマンスの問題がありますか?どのくらいの時間このクエリを実行しますか? (うまく動作しているものを最適化しようとしないでください) –

    +0

    800はまだ問題にはなりませんが、10,000になると、間違いなくクエリが大きく遅くなります。 – zac1987

    0

    の違いを参照してください:あなたが言ったように

    +1

    idはresponse_idです。なぜWHERE句にresponse_idを指定する必要がありますか?私は例を挙げて、10の投稿があり、7つの投稿に回答を送ったとしましょう。他のユーザーが投稿に返信すると、7つの投稿が新しい返信を受け取ったかどうかをチェックして教えてください。システムは他の3つの投稿をチェックしません。私が返信した7つの投稿をチェックします。だから私は別のものを選択する必要があるのです。msgid WHERE username = "zac1987"なので、WHERE句にid = "XYZ"を入れることができません。 – zac1987

    1

    あなたのケースでカバーリングインデックスが優れているかどうかを確認してください。 http://ronaldbradford.com/blog/tag/covering-index/

    0

    2つのクエリは同等です:

    SELECT DISTINCT msgid 
    FROM Tbl_responses 
    WHERE username = 'zac1987' ; 
    

    SELECT msgid 
    FROM Tbl_responses 
    WHERE username = 'zac1987' 
    GROUP BY msgid ; 
    

    私はあなたが(username, msgid)上の複合インデックスを作る示唆しています。これはどちらのバージョンのクエリにも役立ちます。

    しかし、それはあなたが10K(あるいは100K、または1M)の行でテストテーブルを作り、スピードと実行計画をしようとした場合(username)に最初の単純なインデックスで、最高のこと、その後(username, msgid)上の複合インデックスを持つでしょう。差が「一時使用して、ここで使用する」簡単なインデックスを持つ第一ケースことがが表示され、実行計画にExtra列に示される

    、ここで第二の場合に、と複合インデックスは、それは、時期尚早な最適化である5000枚のレコードとスピードのために心配、チューダーが指摘したように

    「インデックスを使用して、どこ使用」と表示されます。 500,000レコードがある場合、またはパフォーマンスが低下した場合は、心配する必要があります。


    注:これらの2つのクエリは、同等ではありませんあるので、あなたは常にGROUP BYにフィールドを移動してDINSTINT句を削除し、期待することはできません、同じ結果:

    SELECT DISTINCT msgid, response 
    FROM Tbl_responses 
    WHERE username = 'zac1987' ; 
    

    SELECT msgid, response 
    FROM Tbl_responses 
    WHERE username = 'zac1987' 
    GROUP BY msgid ; 
    
    +0

    実際には、影響を受ける行が多いほど、行をフィルタリングする必要があるほど平均速度が遅くなるため、速度を見ることなく影響を受ける行を見てテストします。今私は出力800行が影響を受けるのを見ている。 – zac1987

    +0

    実行計画に違いがあります(「追加」欄を参照)。 100K +の行でテストすると、速度の違いもわかります。 –

    関連する問題