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 秒...)。本当に、すべてのヒントをいただければ幸いです。
前もって感謝します。