通过Date.parse搜索(字符串)非常慢?

时间:2011-10-07 03:26:49

标签: ruby-on-rails ruby ruby-on-rails-3

我使用Ryan Bate's search with Ajax episode编写了一些基本的搜索功能。

它基本上做的是从表单中获取一个字符串,并通过模型方法执行类似的查询。我要做的是有条件地搜索数据库中的不同列(due_date和name),并使用我用Date类解析的单个字符串。这样,用户可以按日期搜索项目,或者使用相同的表单搜索项目名称。我的方法看起来像:

def self.search(search) 
    if search
      search_date = Date.parse(search) rescue nil
    end

    if search_date
      where('due_date = ?', search_date)
    elsif search
      where('UPPER(name) LIKE ?', "%#{search.upcase}%")
    else
      scoped
    end
  end  

这就好像用户键入日期一样,Date类能够解析它,在数据库中查找具有该due_date的任何对象。问题是,如果它是一个日期并且它能够被解析,那么搜索速度非常慢。

我想知道是否有人有办法加快速度。 Date类是如此之慢吗?我应该有两种不同的方法吗?或者我应该完全重写我的搜索?

3 个答案:

答案 0 :(得分:5)

我真的怀疑它是Date.parse慢。您应该检查log/development.log以查看查询执行时间。您最有可能遇到的是桌面扫描,因为您错过了due_date上的索引。

始终使用EXAMINE检查慢查询。一个例子:

EXAMINE SELECT * FROM items WHERE due_date='2011-01-01'

您将获得有关它将要排序的行数以及可以使用的任何索引的一些信息。

答案 1 :(得分:1)

虽然Ruby中的日期处理速度非常慢,但对于像这样的单个调用来说,它并不明显......

这可能是您数据库中缺少的索引...

检查您为相关表格定义的索引...您应该在其中进行迁移:

add_index :my_table, :due_date

然后您的数据库将能够快速找到记录。

答案 2 :(得分:0)

虽然之前关于寻找慢查询和利用索引的答案可能会让你更加努力,但你还应该查看Ryan Evan的Date / DateTime的C实现,home_run gem。 / p>