1

記事のテーブル、著者のテーブル、および記事を著者にマップするテーブルがあります。

記事の数が最も多い著者を見つけるために、次のクエリを実行しています。

SELECT a.*, count(*) c
FROM articleAuthors aa
LEFT JOIN authors a ON aa.author_id=a.id
GROUP BY (author_name)
ORDER BY c DESC LIMIT 50

ただし、このクエリは完了するまでに 1 分ほどかかります。データベースには、articles_to_authors テーブルに約 1,000,000 のレコードがあります。

この GROUP BY クエリを高速化するにはどうすればよいですか?

4

1 に答える 1

3

articleAuthors テーブルに 50 人以上の個別の作成者がいると仮定すると、そのコンポーネントだけを事前クエリして、必要な 50 レコードに制限します。(author_id) にインデックスが存在することを確認します。また、authors テーブルに (id) のインデックスがあることを確認してください。クエリを次のように変更します

select
      a.*,
      JustAuthorIDs.cntPerAuthor
   from
      ( select 
              aa.author_id, 
              count(*) cntPerAuthor
           from
              articleAuthors aa
           group by 
              aa.author_id
           order by
              cntPerAuthor DESC
           limit 50 ) JustAuthorIDs
      JOIN Authors a
         on JustAuthorIDs.author_ID = a.id

プレクエリのカウント降順は、事前にフラッシュされ、最初に最大カウントで事前に並べ替えられ、50 レコード後に停止します。次に、名前などを取得するために、authors テーブルに単純に結合します。

「ビルボード」と呼ばれる2人の著者がいる場合、名前の代わりにauthor_IDに基づいてグループ化しています...実際のIDは、2人の間で異なります。

さて、上記がクエリであるため、毎回すべての 100 万レコードをクエリする必要があります。このような場合は、authors テーブルに "AuthoredItems" 列を 1 つ追加した方がよいでしょう。次に、authorArticles テーブルのトリガーを介して、エントリが追加または削除されたときに、author テーブルの 1 人の著者の最終カウントを更新するだけです。次に、"AuthoredItems" 列にインデックスを作成します。次に、次のようにしてクエリを非常に単純化できます

select a.*
   from authors a
   order by a.AuthoredItems
   limit 50
于 2012-06-17T21:39:00.980 に答える