Group BY和ORDER BY优化

时间:2012-11-27 11:34:03

标签: mysql optimization query-optimization

我正在尝试在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行(ORDER BY),然后执行GROUP BY。但显然这不是我想要做的,在某些情况下我最终没有20行。

我真的不知道该怎么办。如果它优化了我的请求(20秒......),我可以改变我的结构。真的,每个提示都会受到赞赏。

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

试试这个

 GROUP BY feed_pool.qid ORDER BY 1 DESC LIMIT 20