mysql - Rails 应用程序在临时服务器上速度很快,在生产环境中慢 20 倍

标签 mysql ruby-on-rails ruby performance activerecord

我遇到了一个奇怪的问题,在临时服务器上测试了一些新功能后,我决定将它们转移到生产环境中。两台服务器上的数据库完全相同。

我正在运行这段代码:

def an_action
  search_start = Time.now
  @a1 = Time.now
  @results = find_hotels
  @a2 = Time.now
  @b1 = Time.now
  @results[:hotels].uniq_by {|x| x["hotel_name"]}.each do |result|
    @markers << "...saving some data..."
  end
  @b2 = Time.now
  search_end = Time.now # search started
  @total_time = search_end - search_start
end

private
def find_hotels
  @hotels = Hotel.includes(:services).within(distance, origin: city).where('nonstop = ?', 0).order("distance ASC")
  return {:hotels => @hotels}
end

在 View 中,我正在打印我在 Controller 操作中测量的时间:

<div>
  Hotels: <%= @results[:hotels].count %>, 
  Markers: <%= @markers.count %>, 
  A: <%= @a2-@a1 %>, 
  B: <%= @b2-@b1 %>, 
  Total: <%= @total_time %>
</div>

问题来了:

暂存服务器:

  Hotels: 476, 
  Markers: 342, 
  A: 0.254782386, 
  B: 0.863244492, 
  Total: 1.118588403

生产服务器:

  Hotels: 476, 
  Markers: 342, 
  A: 20.257541647, 
  B: 0.422051075, 
  Total: 20.679673465

本地主机:

  Hotels: 476, 
  Markers: 342, 
  A: 0.84956, 
  B: 2.98855, 
  Total: 3.83876

生产服务器和暂存服务器是一样的(只有暂存服务器的磁盘空间大 10GB 左右)。我认为问题可能出在 MySQL 索引中,但在两台服务器上加载时间是相同的(大约 0.90 秒)。

为什么生产服务器上的加载时间这么长?我什至不知道从哪里开始寻找问题,我以前从未遇到过这个问题。

我的本​​地主机也比临时服务器慢,但没有生产服务器慢。

提前感谢大家的宝贵时间。

最佳答案

要调查使用了哪些索引,请在两个 sql 服务器上运行以 EXPLAINED 为前缀的查询。例如 EXPLAIN SELECT * FROM users; 然后比较两个结果。

要获取 sql,请使用此行 raise @hotels.to_sql 或查看开发日志。

关于mysql - Rails 应用程序在临时服务器上速度很快,在生产环境中慢 20 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27471286/

相关文章:

mysql - 使用 SQL 中的条件从 3 个不同的表中获取记录

php - 为每个结果输出特定的数组键

php - 如何在单个查询中使用 While 循环编写多个查询?

ruby-on-rails - 如何从 SQLite3 迁移到 PostgreSQL

ruby - dl/win32 加载错误

ruby - 在 Ruby 中保留数组索引值的同时将数组转换为哈希

php - 一个数据库中具有不同字符编码的表。学说问题

mysql - 全局化,Heroku:PG::UndefinedTable:错误:关系不存在

ruby-on-rails - 在 ActiveRecord 中使用 SQL Function 和 IN

ruby - 如何动态定义一个引用外部局部变量的类方法?