0

180,000 行のテーブルでクエリを最適化しようとしています。

    SELECT
            qid

            FROM feed_pool
            WHERE (
                (feed_pool.uid IN
                    (SELECT uid_followed
                        FROM followers
                        WHERE uid_follower = 123 AND unfollowed = 0) AND feed_pool.uid != 123)
                    OR feed_pool.tid IN (SELECT tid FROM follow_tags WHERE follow_tags.uid = 123)
                )
                GROUP BY feed_pool.qid ORDER BY feed_pool.id DESC LIMIT 20

このクエリの最悪の部分は WHERE 句ではなく、GROUP BY と ORDER BY の部分です。

実際、GROUP BY だけを実行すれば問題ありません。ORDER BY だけでも構いません。問題は、両方を使用する場合です。

さまざまなインデックスを試しましたが、現在は feedpool.qid と feedpool.uid のインデックスを使用しています。

最初に最後の 20 行を SELECT (ORDER BY) し、次に GROUP BY を実行するのが良いハックです。しかし、明らかにそれは私がやりたいことではありません。場合によっては、最終的に 20 行もありません。

私は本当に何をすべきかわかりません。リクエストを最適化すれば、構造を変更できます (20 秒...)。本当に、すべてのヒントをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

1

について聞いていJOINますか?サブクエリは常にパフォーマンスに悪影響を及ぼします。次のようなことを試してください:

SELECT feed_pool.qid, followers.uid as fuid, follow_tags as ftuid
FROM feed_pool
    LEFT JOIN followers
        ON feed_pool.uid = followers.uid_followed 
            AND followers.uid_follower = 123 
            AND followers.unfollowed = 0 
            AND feed_pool.uid != 123
    LEFT JOIN follow_tags
        ON feed_pool.tid = follow_tags.tid 
        AND follow_tags.uid = 123
WHERE
    fuid IS NOT NULL
    OR ftuid IS NOT NULL
ORDER BY feed_pool.id DESC 
LIMIT 20
于 2012-11-27T11:48:29.900 に答える
1

これを試して

 GROUP BY feed_pool.qid ORDER BY 1 DESC LIMIT 20
于 2012-11-27T12:09:22.137 に答える