【问题标题】:Complex MySQL Query is Slow复杂的 MySQL 查询很慢
【发布时间】:2012-06-27 15:36:58
【问题描述】:

我一直在研究的一个程序使用一个复杂的 MySQL 查询来组合来自多个具有匹配项 ID 的表的信息。但是,由于我添加了您在下面看到的子查询,因此查询的执行时间从不到 1 秒变为超过 3 秒。您对我可以做些什么来优化此查询以使其更快有什么建议吗?我认为拥有一个复杂的查询比拥有 4 或 5 个更小的查询要好,我错了吗?

    SELECT uninet_articles.*, 
           Unix_timestamp(uninet_articles.gmt), 
           uninet_comments.commentcount, 
           uninet_comments.lastposter, 
           Unix_timestamp(uninet_comments.maxgmt) 
    FROM   uninet_articles 
           RIGHT JOIN (SELECT aid, 
                              (SELECT poster 
                               FROM   uninet_comments AS a 
                               WHERE  b.aid = a.aid 
                               ORDER  BY gmt DESC 
                               LIMIT  1) AS lastposter, 
                              Count(*)   AS commentcount, 
                              Max(gmt)   AS maxgmt 
                       FROM   uninet_comments AS b 
                       GROUP  BY aid 
                       ORDER  BY maxgmt DESC 
                       LIMIT  10) AS uninet_comments 
                   ON uninet_articles.aid = uninet_comments.aid 
    LIMIT  10 

【问题讨论】:

  • 你需要的表上有所有的“索引”吗?
  • 作为一个简短的答案,否和是 - 我没有具体的建议,但你认为一个复杂的查询总是比多个小查询更好是不正确的。

标签: mysql performance subquery


【解决方案1】:

查询可以看作是遍历数据以查找匹配项。子查询需要多次遍历数据才能找到需要的项目。在这种情况下,您可能希望将其重写为多个查询。很多时候,多个更简单的查询会更好 - 我认为这是其中一种情况。

您还可以查看您的索引是否运行良好 - 如果您知道那是什么。原因与此有关:How does database indexing work?.

对于具体建议,您可以在不同的查询中找到每个 AID 的最后一张海报,然后简单地加入它。

【讨论】:

    【解决方案2】:

    这始终取决于您拥有的数据以及您使用它的方式。

    你应该在你的选择上使用解释来查看你是否使用了索引。 http://dev.mysql.com/doc/refman/5.5/en/explain.html

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多