首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"SELECT“花了很长时间

"SELECT“花了很长时间
EN

Stack Overflow用户
提问于 2015-07-16 00:35:49
回答 2查看 893关注 0票数 1

我正在从一个名为“预订”的表中选择记录,该表包含超过10万条记录。我对SQL很陌生,由于某种原因,这需要很多秒才能完成,甚至需要在我的生产服务器上超时:

代码语言:javascript
运行
复制
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语句似乎是进程挂起的地方。

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

编辑

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

代码语言:javascript
运行
复制
    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会话存储被填满。我将大量数据从报表中转储到会话存储中,以便在请求之间保存数据,以避免执行另一个数据库查询,但这会降低性能。数据库查询仍然需要5秒左右的时间,但我可以接受。

EN

回答 2

Stack Overflow用户

发布于 2015-07-16 01:19:53

只要有可能,您就应该避免在应用程序中执行原始SQL。更喜欢使用ActiveRecord接口,这不仅将使您的应用程序更加安全,而且它还将以一种优化查询的方式执行查询。在您的示例中,重构bookings_in_date_range方法以使用ActiveRecord的.where方法:

代码语言:javascript
运行
复制
def bookings_in_date_range(division, enddate, startdate)
  YourModelName.where("division = ? AND enddate = ? AND startdate = ?",division, parsedate(enddate), parsedate(startdate))
end

若要在范围内查找事物,请使用

代码语言:javascript
运行
复制
YourModelName.where("division = ? AND enddate <= ? AND startdate >= ?",division, parsedate(enddate), parsedate(startdate))
票数 1
EN

Stack Overflow用户

发布于 2015-07-16 02:48:13

使用解释查看查询执行计划是什么: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),索引都是必需的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31443531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档