我有以下查询:
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
查询非常慢。关于如何提高性能的任何想法。
答案 0 :(得分:2)
考虑在表上添加以下索引(如果它们还没有)
articles - (id)
authors - (id,email)
article_citations_stats - (article_id,count_cited)
这可以加快您的查询速度。
此外,您可以解释您要做的事情,如果可能的话,我们会帮助您提出更快的查询。
答案 1 :(得分:1)
只是一个技术问题(对不起,这应该在评论中,但因为它是我的第一篇文章,我还没有足够的分数):是作者允许有更多文章和文章有更多作者?
从当前定义我可以看到 id 上的 authors 表中的PK,而 article_id 不是null。所以如果:
id 是作者的 id 然后每个作者只有一篇文章(可能与另一个作者共享),我认为你不需要加入文章表,您可以直接从 authors 表中计算 articles_id 。您也可以直接使用它来加入 stats 表。
id 只是该行的ID 那么实际上作者可以有超过1的文章,但是作者表可能是巨大的,并且可能更好地重新设计它以使 author_id 文章表中的。但是,在这种方法中,您无法为一篇文章提供更多作者。
允许许多作者有更多文章,反之亦然,这里需要桥接表。然后使用该表进行分组。因为1.不允许有更多的文章,2。不允许有更多的作者,我会去3。