如何改进查询以减少所花费的时间?

时间:2013-05-22 07:03:57

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

考虑我有15个类别,每个类别有6个子类别,现在我有项目表,我必须根据最新购买日期从每个子类别中找到3个项目。

category 1 ---> level 1 ---> 3 items with latest date
category 1 ---> level 2 ---> 3 items with latest date
  ...
  ...
  ...
category 15 ---> level 5 ---> 3 items with latest date
category 15 ---> level 6 ---> 3 items with latest date

我试过了

@categories.each do |value|
   @sub-categories.each do |value1|
      array = Item.find(:all, :conditions => ["customer_id IN (?) AND category_id = ? AND sub-category_id = ?", @customer, value.id, value1.id], :order => 'created_at DESC', :limit => 3)
            array.each do |value2|
                   @latest_item_of_each_customer << value2
            end
          end
        end

这将重复90次作为15个类别x6个子类别,因此需要很长时间。请告诉我如何通过有效查询减少时间。

2 个答案:

答案 0 :(得分:0)

根据您所引入的数据集的大小,加速这样的嵌套循环的一种方法是急切加载其中一些关联。

@categories = Category.all(:include => :sub_categories)

这可以减少您正在进行的查询量,从而提高性能。

如果您想了解更多关于热切加载的信息,请查看此http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

答案 1 :(得分:0)

1)首先是......项目表中category_id的用途是什么,因为我们已经有了sub_category_id,而从sub_category我们可以得到类别,你想要每个子类别的项目。

  @latest_item_of_each_customer = []
  @sub_categories = SubCategory.all

  @sub_categories.each do |value1|
    @latest_item_of_each_customer << Item.find(:all, :conditions => ["customer_id IN (?) and sub_category_id = ?", @customer, value1.id], :order => 'created_at DESC', :limit => 3)
  end

  @latest_item_of_each_customer  = @latest_item_of_each_customer.flatten