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

但是,此查询需要一整分钟才能完成。该数据库在articles_to_authors 表中有大约1,000,000 条记录。

我怎样才能加快这个 GROUP BY 查询?

4

1 回答 1

3

假设 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
于 2012-06-17T21:39:00.980 回答