在MySQL中加速GROUP BY类型查询的最快方法是什么?

时间:2012-06-17 21:25:06

标签: mysql performance group-by

我有一个文章表,一个作者表和一个将文章映射到作者的表。

我正在进行以下查询,以找出文章最多的作者:

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查询?

1 个答案:

答案 0 :(得分: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表以获取名称和其他任何内容。

我有基于author_ID而不是名称的组,如果你有两个叫做“广告牌”的作者......实际ID将在两者之间区别开来。

现在,由于以上是一个查询,您每次都需要查询所有百万条记录。对于类似这样的事情,在authors表中添加单个“AuthoredItems”列可能会更好。然后,通过authorArticles表上的触发器,当添加或删除条目时,只需更新作者表上一位作者的最终计数。然后,在“AuthoredItems”列上构建索引。然后,您可以通过执行

来超级简化查询
select a.*
   from authors a
   order by a.AuthoredItems
   limit 50