首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL查询速度慢(连接/计数)

MySQL查询速度慢(连接/计数)
EN

Stack Overflow用户
提问于 2015-03-25 19:46:38
回答 2查看 34关注 0票数 1

我有一个疑问:

代码语言:javascript
复制
 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。我希望有人能在这里帮助我

解释命令:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 20:08:57

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

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

代码语言:javascript
复制
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 

每个辅助表都需要一个以assembly开头的索引。

票数 1
EN

Stack Overflow用户

发布于 2015-03-25 20:02:24

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

代码语言:javascript
复制
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`);

在创建这些索引之后再试一次查询,它应该会更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29265114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档