我有以下代码:
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);
答案 0 :(得分: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 = rather a lot
。
我不是Ruby wiz所以也许其他人可以发布你如何做到这一点。