【发布时间】:2016-06-17 13:50:05
【问题描述】:
我有以下代码:
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);
【问题讨论】:
-
能否请您提供表格描述以及您在其上创建的任何索引?
-
你真的,迫切需要更新那个 Ruby。它生成什么查询?
.to_sql方法通常在这里通知。在这里使用merge是完全不合适的,您在此过程中生成了 N 个哈希值。使用arts[team.name] = ...并将arts作为您块中的最后一件事。 -
你能把 EXPLAIN SELECT * FROM npt_articles INNER JOIN npt_authors INNER JOIN users INNER JOIN npt_teams WHERE (npt_teams.id = 1) 的结果贴出来
标签: mysql ruby sequel ruby-1.8.7