2017-07-16 4 views
-1

クエリを最適化してください。どのように最適化MySQLのクエリ:ユーザーは最後のメッセージを読む

ユーザーが読んだとき、私はメッセージ

  • 1へのメッセージ、
  • comment_karmaセットを送信するメッセージを受信するユーザーのためのフィールド

    • 'comment_parent'、
    • ユーザーのための 'user_idを' がテーブルを持っています'更新されました'は、ユーザーがメッセージを読むときの日時です。

    最終メッセージを読んでいる人のリストを取得する方法o最後の7日間。

    最後に見つかったメッセージに最適な方法がありますか?SELECT max(updated)?

    SELECT wc.comment_parent,wc.user_id, wc.updated FROM `wp_comments` wc 
        WHERE (wc.comment_parent IN (4786,322,1492,257,4760,40,41) AND wc.user_id=1) 
        AND wc.`comment_karma` = 1 
        AND updated = (SELECT max(`updated`) FROM `wp_comments` as cc WHERE cc.`user_id`= wc.user_id AND comment_parent = wc.comment_parent) 
        AND updated > DATE_SUB(NOW(),INTERVAL 1 WEEK) 
        ORDER BY wc.updated DESC LIMIT 0 , 30 
    
  • +0

    このバージョンの問題点は何ですか? –

    +0

    問題はありませんが、おそらく最良の方法はありますか? –

    答えて

    2

    で実行planstを見ることができるあなたのクエリは、同じ結果を取得するが、他の方法が、私には正常に見えます。ただし、これらの列(comment_parent, user_id, updated)のみを選択する場合は、次のクエリを使用してください。

    SELECT wc.comment_parent, wc.user_id, max(wc.updated) as updated 
    FROM wp_comments wc 
    WHERE wc.comment_parent IN (4786,322,1492,257,4760,40,41) 
        AND wc.user_id=1 
        AND wc.updated > NOW() - INTERVAL 1 WEEK 
        AND wc.`comment_karma` = 1 
    GROUP BY wc.user_id, wc.comment_parent 
    ORDER BY max(wc.updated) desc 
    
    +0

    多くの方々に感謝します。 –

    1

    あなたは少しあなたのクエリを最適化し、特定のインデックスのための恩恵を受けることができます:

    SELECT 
        wc.comment_parent,wc.user_id, wc.updated 
    FROM 
        `wp_comments` wc 
    WHERE 
         wc.comment_parent IN (4786,322,1492,257,4760,40,41) 
        AND wc.user_id = 1 
        AND wc.comment_karma = 1 
        AND updated = 
         (SELECT 
          max(`updated`) 
         FROM 
          wp_comments as cc 
         WHERE 
           /* put here the updated restriction, 
            the subquery will take care of everything */ 
           cc.updated > now() - INTERVAL 1 WEEK 
          AND cc.user_id = wc.user_id 
          AND cc.comment_parent = wc.comment_parent 
         ) 
    ORDER BY 
        wc.updated DESC 
    LIMIT 
        0 , 30 ; 
    

    そして、次のインデックス作成:インデックスが比較的小さい

    ​​3210

    を、まだそれサブクエリは、インデックス(すべての関連するデータがそこにあることを確認する)をチェックするだけです。現在のバージョンのMySQLとMariaDBはインデックス内のDESCを認識しますが、はそれを受け入れません。。日は、最大(更新)を見つけることは簡単です。

    あなたが設定を確認し、dbfiddle here

    +0

    お返事ありがとう、新しいツール(dbfiddle)。 次の質問では、なぜ一部のフィールドのインデックスが1つより優れているのですか? CREATE INDEX idx_wp_comment_rel ON wp_comments(user_id、comment_parent、更新されたDESC、comment_karma); CREATE INDEX idx_wp_comment_up ON wp_comments(更新されたDESC)。 –

    +1

    これは[*カバーインデックス*](https://stackoverflow.com/questions/62137/what-is-a-covered-index)です。クエリ内のすべての情報はインデックス内に*すでに*あります。したがって、データベースエンジンはサブクエリを実行するために実際のテーブル*を参照する必要はありません。また、索引の列の順序を慎重に選択することで、必要性の高いものをまとめてDBMSが読み取る必要があるデータ・ページの量を減らすことができます。 – joanolo

    +0

    ありがとうございました! –