MySQL 查询很慢 (Joins/counts)

MySQL Query is slow (Joins/counts)

我有这个查询:

 SELECT `assemblies`.`id`,
   `assemblies`.`type`,
   `assemblies`.`champion`,
   `assemblies`.`name`,
   `assemblies`.`author`,
   `assemblies`.`githublastmod`,
   ( assemblies.forum IS NOT NULL ) AS forumExists,
   Count(votes.id)                  AS votesCount,
   Count(install_clicks.id)         AS installCount,
   Count(github_clicks.id)          AS githubCount,
   Count(forum_clicks.id)           AS forumCount
FROM   `assemblies`
   INNER JOIN `votes`
           ON `votes`.`assembly` = `assemblies`.`id`
   INNER JOIN `install_clicks`
           ON `install_clicks`.`assembly` = `assemblies`.`id`
   INNER JOIN `github_clicks`
           ON `github_clicks`.`assembly` = `assemblies`.`id`
   INNER JOIN `forum_clicks`
           ON `forum_clicks`.`assembly` = `assemblies`.`id`
WHERE  `assemblies`.`type` = 'utility'
   AND Unix_timestamp(Date(assemblies.githublastmod)) > '1419536536'
GROUP  BY `assemblies`.`id`
ORDER  BY `votescount` DESC,
      `githublastmod` DESC  

出于某种原因,这个查询非常慢,我正在使用数据库引擎 MyISAM。我希望有人能在这里帮助我 :)

解释命令:

您的问题应该使用正确的索引来解决:

CREATE INDEX index_name_1 ON `votes`(`assembly`);
CREATE INDEX index_name_2 ON `install_clicks`(`assembly`);
CREATE INDEX index_name_3 ON `github_clicks`(`assembly`);
CREATE INDEX index_name_4 ON `forum_clicks`(`assembly`);

创建这些索引后再次尝试您的查询,它应该会更快。

我相信在这种情况下,对计数进行子查询会使它 运行 快很多(并且值将是正确的)。

原始查询的问题是中间行数的激增:对于每个 'assembly',有 n1 票、n2 安装等。这导致了 n1*n2*... 行 个程序集。

SELECT  `assemblies`.`id`, `assemblies`.`type`, `assemblies`.`champion`,
        `assemblies`.`name`, `assemblies`.`author`, `assemblies`.`githublastmod`,
        ( assemblies.forum IS NOT NULL ) AS forumExists, 
      ( SELECT  Count(*)
            FROM  votes
            WHERE  `assembly` = `assemblies`.`id` 
      ) AS votesCount, 
      ( SELECT  Count(*)
            FROM  install_clicks
            WHERE  `assembly` = `assemblies`.`id` 
      ) AS installCount, 
      ( SELECT  Count(*)
            FROM  github_clicks
            WHERE  `assembly` = `assemblies`.`id` 
      ) AS githubCount, 
      ( SELECT  Count(*)
            FROM  forum_clicks.id
            WHERE  `assembly` = `assemblies`.`id` 
      ) AS forumCount
    FROM  `assemblies`
    WHERE  `assemblies`.`type` = 'utility'
      AND  Unix_timestamp(Date(assemblies.githublastmod)) > '1419536536'
    ORDER BY  `votescount` DESC, `githublastmod` DESC 

每个辅助 table 需要一个索引 starting with assembly.