【问题标题】:Slow MySQL query - how to improve performanceMySQL 查询慢 - 如何提高性能
【发布时间】:2016-05-04 13:37:21
【问题描述】:

我有以下疑问:

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

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

【问题讨论】:

  • 请为每个表提供您的架构 (SHOW CREATE TABLE)
  • 性能问题应该包括EXPLAIN ANALYZE和一些关于表大小、索引、当前时间性能、期望时间等的信息。Slow是一个相对术语,我们需要一个真实的值来比较。 MySQL
  • explain analyze 呢?

标签: mysql left-join inner-join


【解决方案1】:

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

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

这应该会加快您的查询速度。

此外,您可以解释您正在尝试做什么,如果可能,我们将帮助您提出更快的查询。

【讨论】:

  • 感谢 Sagi,我正在尝试为那些在他们发表的所有文章中引用超过 10 次的作者(电子邮件)。还有文章数。
  • 我添加了所有索引(其中一些已经存在),但它仍然很慢。我已经在等待 150 秒并且仍在处理中。
  • 还添加了创建表架构
  • 你能给我提供输入示例和预期输出吗?我不明白你到底在做什么,为什么有部分在子查询之外?
  • 如果可能还提供示例数据
【解决方案2】:

只是一个技术问题(抱歉,这应该在评论中,但由于这是我的第一篇文章,我还没有足够的分数):作者是否允许拥有更多文章文章 有更多的作者

根据当前定义,我可以在 id 上的 authors 表中看到 PK,并且 article_id 不为空。所以如果:

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

  2. id 只是行的 id 那么实际上作者的 articles 可能比 1 多,但是 authors 表可能会很大,重新设计它可能会更好,使其具有 author_idarticles 表中。但是,在这种方法中,一篇文章不能有更多作者

  3. 允许许多作者拥有更多文章,反之亦然,此处需要桥接表。然后使用该表进行分组。因为 1. 不允许有更多的文章和 2. 不允许有更多的作者,所以我会选择 3.

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2013-03-21
    • 2013-03-28
    • 1970-01-01
    • 2011-12-03
    • 2023-04-08
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多