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