慢MySQL查询 - 如何提高性能

时间:2016-05-04 13:37:21

标签: mysql left-join inner-join

我有以下查询:

SELECT `authors`.email, COUNT(articles.id),  SUM(stats.count_stats)
FROM articles
INNER JOIN authors ON articles.id = `authors`.article_id 
LEFT JOIN (
    SELECT article_id, SUM(count_cited) AS count_stats 
    FROM article_citations_stats 
    GROUP BY article_id) AS stats ON articles.id = stats.article_id
GROUP BY `authors`.email
HAVING SUM(stats.count_stats) > 10

表格:

authors has 200 000 rows
articles has 60 000 riws
article_citations_stats has 200 000 rows

查询非常慢。关于如何提高性能的任何想法。

2 个答案:

答案 0 :(得分:2)

考虑在表上添加以下索引(如果它们还没有)

articles - (id) 
authors - (id,email)
article_citations_stats - (article_id,count_cited)

这可以加快您的查询速度。

此外,您可以解释您要做的事情,如果可能的话,我们会帮助您提出更快的查询。

答案 1 :(得分:1)

只是一个技术问题(对不起,这应该在评论中,但因为它是我的第一篇文章,我还没有足够的分数):是作者允许有更多文章文章有更多作者

从当前定义我可以看到 id 上的 authors 表中的PK,而 article_id 不是null。所以如果:

  1. id 作者的 id 然后每个作者只有一篇文章(可能与另一个作者共享),我认为你不需要加入文章表,您可以直接从 authors 表中计算 articles_id 。您也可以直接使用它来加入 stats 表。

  2. id 只是该行的ID 那么实际上作者可以有超过1的文章,但是作者表可能是巨大的,并且可能更好地重新设计它以使 author_id 文章表中的。但是,在这种方法中,您无法为一篇文章提供更多作者

  3. 允许许多作者有更多文章,反之亦然,这里需要桥接表。然后使用该表进行分组。因为1.不允许有更多的文章,2。不允许有更多的作者,我会去3。