sql >> データベース >  >> RDS >> Mysql

MySQLクエリを最適化して、whereの使用を回避します。一時的な使用; filesortの使用

    SELECT  id, name, last_reply, replies
    FROM    (
            SELECT  topic_id, MAX(date) AS last_reply, COUNT(*) AS replies
            FROM    wp_pod_tbl_forum
            GROUP BY
                    topic_id
            ) r
    JOIN    wp_pod_tbl_forum t
    ON      t.topic_id = 0
            AND t.id = r.topic_id
    UNION ALL
    SELECT  id, name, date, 0
    FROM    wp_pod_tbl_forum t
    WHERE   NOT EXISTS
            (
            SELECT  NULL
            FROM    wp_pod_tbl_forum r
            WHERE   r.topic_id = t.id
            )
            AND t.topic_id = 0
    ORDER BY
           date DESC
    LIMIT 0, 20
    

    テーブルがMyISAMの場合 またはid PRIMARY KEYではありません 、(topic_id, id)で複合ondexを作成する必要があります 。

    テーブルがInnoDBの場合 およびid PRIMARY KEYです 、(topic_id)のインデックス (id 暗黙的にインデックスに追加されます。

    更新

    (topic_id, id)にインデックスがある場合、このクエリはおそらくさらに効率的です。 および(date, id)

    パフォーマンスの詳細については、ブログのこの記事を参照してください:

    このクエリは30 msで完了します 100,000で 行のサンプルデータ:

    SELECT  id, name, last_reply,
            (
            SELECT  COUNT(*)
            FROM    wp_pod_tbl_forum fc
            WHERE   fc.topic_id = fl.topic_id
            ) AS replies
    FROM    (
            SELECT  topic_id, date AS last_reply
            FROM    wp_pod_tbl_forum fo
            WHERE   id = (
                    SELECT  id
                    FROM    wp_pod_tbl_forum fp
                    WHERE   fp.topic_id = fo.topic_id
                    ORDER BY
                            fp.date DESC, fp.id DESC
                    LIMIT 1
                    )
                    AND fo.topic_id <> 0
            ORDER BY
                    fo.date DESC, fo.id DESC
            LIMIT 20
            ) fl
    JOIN    wp_pod_tbl_forum ft
    ON      ft.id = fl.topic_id
    UNION ALL
    SELECT  id, name, date, 0
    FROM    wp_pod_tbl_forum t
    WHERE   NOT EXISTS
            (
            SELECT  NULL
            FROM    wp_pod_tbl_forum r
            WHERE   r.topic_id = t.id
            )
            AND t.topic_id = 0
    ORDER BY
           last_reply DESC, id DESC
    LIMIT  20
    

    このクエリを効率的にするには、両方のインデックスが必要です。

    テーブルがInnoDBの場合 および id PRIMARY KEYです 、次にindexesからidを省略できます 上記。



    1. MySQLで外部キー制約を一時的に無効にするにはどうすればよいですか?

    2. DATE_ADD()の例– MySQL

    3. Oracle Forms /Forms6iでのタイマーの作成と時計の表示

    4. フォーラムは未読のトピックをどのように表示しますか?