假设 articleAuthors 表有 50 多个不同的作者,我将只预查询该组件并限制为您想要的 50 条记录。确保 (author_id) 上存在索引。此外,确保您的作者表在 (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 条记录后停止。然后,简单地连接到作者表以获取名称和其他任何内容。
我根据作者 ID 而不是名称来分组,如果您有两个名为“广告牌”的作者...实际 ID 在他们两个之间是不同的。
现在,由于以上是查询,您将始终需要每次查询所有百万条记录。对于这样的事情,最好在作者表中添加一个“AuthoredItems”列。然后,通过 authorArticles 表上的触发器,当添加或删除条目时,只需更新 author 表上一位作者的最终计数。然后,在“AuthoredItems”列上建立索引。然后,您可以通过执行超级简化查询
select a.*
from authors a
order by a.AuthoredItems
limit 50