我有以下代码:
team_articles = user.npt_teams.to_a.inject({}) {|arts,team|
arts.merge({ team.name =>
NptArticle.join(:npt_authors).join(:users).join(:npt_teams).where(:npt_teams__id => team.id).to_a.uniq})
}
它会导致我的终端停止响应,并且我的 Macbook 速度变慢。
在 mysqlworkbench 中它会立即得到响应。
一个建议是创建 NptArticle 对象的更轻版本,但我不太确定如何创建一个提取较少列的版本,因此解决此问题的任何建议都很好。
这是the table .
生成的SQL是:
SELECT * FROM `npt_articles` INNER JOIN `npt_authors` INNER JOIN `users` INNER JOIN `npt_teams` WHERE (`npt_teams`.`id` = 1)
我很想升级 Ruby 版本,但我不能。我正在处理一个旧的代码库,这是它使用的 Ruby 版本。有计划在未来使用更现代的工具进行重建,但目前这是我必须使用的。
Results来自:
EXPLAIN SELECT * FROM npt_articles INNER JOIN npt_authors INNER JOIN users INNER JOIN npt_teams WHERE (npt_teams.id = 1);
最佳答案
因此,对于npt_team.id =1
,您正在为所有人执行交叉联接:
npt_articles
npt_authors
users
即使文章、作者和用户的数量适中,您也会获得大量结果,因为联接不受限制。通常,您会使用类似以下内容:
INNER JOIN `npt_authors` ON (npt_articles.ID=npt_authors.articleID)
(这取决于您的数据库如何关联)。
此外,您还需要在将表相互关联的字段上建立索引,这也会加快速度。
查看EXPLAIN SELECT
的行列。这是连接的每个部分正在处理的行数。要估计已处理的总行数,请将这些数字相乘。 1 x 657 x 269723 x 956188 = 相当多
。
我不是 Ruby 专家,所以也许其他人可以发布你是如何做到这一点的。
关于mysql - 后续查询导致脚本挂起并导致计算机速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37883347/