mysql - 后续查询导致脚本挂起并导致计算机速度变慢

标签 mysql ruby sequel ruby-1.8.7

我有以下代码:

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/

相关文章:

javascript - 创建搜索函数以使用 'GET' 方法搜索 Sql 数据库

php - MySQL 对可能不返回任何内容的查询的错误处理

php - 我应该限制或减少我的数据库查询吗?

ruby-on-rails - Pundit::NotDefinedError:无法找到策略 `UserPolicy`

Ruby:转义转义序列?

ruby - 不可谷歌搜索的 ruby 方法 method

ruby - Sql中的多行插入

PHP 列求和结果 MYSQL

mysql - 在 MySQL 命令 : sleep 中显示 PROCESSLIST

mysql - 我应该如何处理 Ruby Sequel 中的连接超时?