mysql - Ruby on Rails SQL "SELECT"需要很长时间

标签 mysql ruby-on-rails ruby sqlite

我正在从包含超过 100,000 条记录的名为“bookings”的表中选择记录。我是 SQL 的新手,由于某种原因,这需要很多秒才能完成,甚至在我的生产服务器上超时:

def bookings_in_date_range(division, startdate, enddate)
  sql = "SELECT * FROM bookings WHERE division = '#{division}';"
  bookings = ActiveRecord::Base.connection.execute(sql) # all bookings from this division
  bookingsindaterange = bookings.select { |b| (parsedate(b["date"]) >= parsedate(startdate)) and (parsedate(b["date"]) <= parsedate(enddate)) } # refine to bookings in date range
end

def parsedate(date) # get date from mm/dd/yy format
  d = date.split("/")
  return Date.parse("#{d[2]}-#{d[0]}-#{d[1]}")
end

我还包括了我用来重新格式化日期的函数,但是根据我的测试,执行 SQL 语句似乎是进程挂起的地方。

我的目标是选择指定日期范围内“部门”中的所有“预订”。对于预订数量较少的部门,现有代码的运行速度更快。

编辑

下面 Otávio 的代码似乎加快了速度。但是,我的要求是查看预订是否在某个日期范围内(在开始日期 或之后以及结束日期 或之前)。我不知道如何将此逻辑放入 .where 语句中,所以我正在运行这样的循环:

    bookings_start_thru_end = []
    (startdate..enddate).each do |date|
      date_bookings = Booking.where("division = ? AND date = ?",division, date.strftime("%m/%d/%y"))
      date_bookings.each do |b|
        bookings_start_thru_end.push b
      end
    end

此外,崩溃的问题是 ActiveRecord session 存储已满。我将报告中的一堆数据转储到 session 存储中以在请求之间保存它以避免进行另一次数据库查询,但这会降低性能。数据库查询仍然需要 5 秒左右,但我可以接受。

最佳答案

使用EXPLAIN查看查询执行计划是什么: https://dev.mysql.com/doc/refman/5.6/en/explain.html https://dev.mysql.com/doc/refman/5.6/en/using-explain.html

现在我的猜测是,您在 WHERE 中引用的列上没有索引,这会导致表扫描,从而导致查询运行非常缓慢。但这只是我的猜测,因为我不知道你们的表格。

无论您使用原始 sql 还是事件记录 (spit),都需要索引。

关于mysql - Ruby on Rails SQL "SELECT"需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443531/

相关文章:

mysql - 在 Windows 上通过 putty 编写 ssh 脚本

java.sql.SQLException : Data truncated for column 异常

php - 在 MySQL 中选择 float

ruby-on-rails - Rails 选项卡分页问题

ruby-on-rails - Ruby/Rails - 日期时间解析

Ruby PHP 解析库?

ruby-on-rails - 从另一个模型文件调用方法

mysql - 我可以将 MySQL AUTO_INCREMENT 设置为什么值以将其重置为下一个可用值

ruby-on-rails - Ruby 1.9.2 中的 Process.fork 和 Process.spawn 有什么区别

ruby - 删除递归哈希数组中包含特定键=>值的哈希