0

100件の投稿を取得して、先週「リミックス」された回数で並べ替えようとしています。これまでの私の質問は次のとおりです。

SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts 
LEFT JOIN (
    SELECT * FROM remixes WHERE created_at >= 1343053513
) AS remixes ON posts.id = remixes.post_id
GROUP BY posts.id 
ORDER BY count DESC, posts.created_at DESC
LIMIT 100

これにより、正しい結果が得られます。ただし、実行した後、DESCRIBE私はこれを取得します:

DESCRIBE構文の結果

そしてここに私のインデックスがありますposts

投稿インデックス

そして私のインデックスremixes

リミックスインデックス

そして、ここに私の質問があります:

  1. 追加の列で使用されている用語が実際に私に伝えようとしていることを説明できますか?
  2. このクエリを最適化して拡張性を高める方法についてのヒントを教えてください。

前もって感謝します!

アップデート

Zaneのソリューションに従って、クエリを次のように更新しました。

SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts 
LEFT JOIN remixes ON posts.id = remixes.post_id AND remixes.created_at >= 1343053513
GROUP BY posts.id 
ORDER BY count DESC, posts.created_at DESC
LIMIT 100

そして、これが最新のものですDESCRIBE

最新の説明

私はまだそのfilesort部分について心配しています。何か案は?

4

2 に答える 2

1

副選択でラップしないようにしてください。JOINこれにより、副選択の結果を格納するインデックスのない一時テーブルが作成され、そこでインデックスのないテーブルに結合されます。

代わりにcreated_at、リミックステーブルを結合するときに追加の結合条件として配置します。

SELECT 
    a.title, COUNT(b.post_id) AS remixcnt
FROM 
    posts a
LEFT JOIN 
    remixes b ON a.id = b.post_id AND b.created_at >= 1343053513
GROUP BY 
    a.id, a.title
ORDER BY 
    remixcnt DESC, a.created_at DESC
LIMIT 100
于 2012-07-22T23:13:25.690 に答える
0

それは私には思われる

SELECT COUNT(remixes.post_id) AS count, posts.title
FROM posts 
LEFT JOIN (
    SELECT * FROM remixes WHERE created_at >= 1343053513
) AS remixes ON posts.id = remixes.post_id
GROUP BY posts.id 
ORDER BY count DESC, posts.created_at DESC
LIMIT 100

次のように書き直すことができます

SELECT COUNT(r.post_id) AS count, posts.title
FROM posts 
LEFT JOIN remixes r ON posts.id = r.post_id
WHERE r.created_at >= 1343053513
GROUP BY posts.id 
ORDER BY count DESC, posts.created_at DESC
LIMIT 100

これにより、より良いEXPLAIN計画が得られ、より速く実行できるはずです。

于 2012-07-22T22:50:17.577 に答える