2012-06-17 40 views
1

我有一篇文章,一張作者的表格和一張將作品映射到作者的表格。在MySQL中加快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

這些表上的索引是什麼?您可以發佈查詢的解釋輸出嗎? – Ben

+0

快速提問......文章中有超過50位作者的作者表? – DRapp

+0

@Ben - On'authors'表我在'author_name'上有一個全文索引,'id'上有主鍵索引。在'articleAuthors'表上,我有'author_id'上的鍵索引,'article_id'上的鍵索引和'id'上的主鍵索引。我會暫時發佈解釋輸出。 – bodacydo

回答

3

在articleAuthors表中有超過50個不同的作者的假設下,我會預先查詢該組件並限制爲您需要的50個記錄。確保(author_id)上存在索引。另外,請確保您的作者表在(id)上有一個索引。通過計數在prequery降查詢更改爲

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的組而不是名稱,因爲如果您有兩位作者稱爲「billboard」......實際的ID將在他們兩個之間不同。

現在,以上是一個查詢,您將永遠需要每次查詢所有百萬條記錄。對於這樣的事情,在authors表中添加一個「AuthoredItems」列可能會更好。然後,通過authorArticles表上的觸發器,當添加或刪除條目時,只需更新作者表上一個作者的最終計數。然後,在「AuthoredItems」列中創建一個索引。然後,您可以通過做超級簡化查詢

select a.* 
    from authors a 
    order by a.AuthoredItems 
    limit 50 
+0

這完全工程@Drapp!非常感謝。這也很快 - 這個查詢花了大約1秒!我沒有想到author_id的分組。完全是我的錯。我將重新運行原始查詢,並查看按照author_id分組的速度。 – bodacydo

+0

不錯的更新@Drapp。我不熟悉觸發器(我不知道MySQL有它們)。我會研究創建一些觸發器!這真的是最好的方式。 :) – bodacydo

+0

@bodacydo,很高興幫助...不要忘記「複選標記」的答案,所以沒有人認爲仍然是一個開放的問題:) – DRapp