我正在尝试在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秒......),我可以改变我的结构。真的,每个提示都会受到赞赏。
提前致谢。
答案 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