Mysql 优化ActiveRecord查询

Mysql 优化ActiveRecord查询,mysql,ruby-on-rails,ruby-on-rails-3,activerecord,Mysql,Ruby On Rails,Ruby On Rails 3,Activerecord,我一直在努力优化Rails应用程序,但我遇到了一个问题: def self.random_selection(n) items = scoped(:joins => "JOIN (SELECT id FROM #{table_name} WHERE medias_count > 0 ORDER BY RAND() LIMIT #{n.to_i} ) AS random_ids ON #{table_name}.id

我一直在努力优化Rails应用程序,但我遇到了一个问题:

def self.random_selection(n)
  items = scoped(:joins => "JOIN (SELECT id
      FROM #{table_name}
      WHERE medias_count > 0
      ORDER BY RAND()
      LIMIT #{n.to_i}
    ) AS random_ids
    ON #{table_name}.id = random_ids.id"
  )
  items.each do |genre|
    genre.medias.sort! do |x,y|
      y.vote_total <=> x.vote_total
    end
  end
  items
end
其想法是,它将选择一些随机类型,其中有媒体。一旦被选中,它将在最高评级的媒体上排序,我认为可以在视图中使用顶级媒体

这是一个非常昂贵、难看的查询,我希望可以采取一些方法来优化它

我可以将所选媒体滚动到原始查询中吗

我是否应该从另一个方向着手,随机选择高收视率的媒体,从中获取流派?也可以接受,但如果它没有提供任何改进,那么它们就没有意义了

我在InnoDB中使用Rails 3、Ruby 1.9.2和MySQL。

我的解决方案

class Genre
  scope :having_media, where('medias_count > 0')
  scope :random, lambda { |limit| where(:id => random_ids(limit)) }

  def self.random_ids(limit)
    having_media.select('id').sample(limit).map(&:id)
  end

  def self.random_selection(limit)
    random(10).includes(:medias).each do |genre|
      genre.medias.sort! do |x,y|
        y.vote_total <=> x.vote_total
      end
    end   
  end
end

class Media
  scope :voted_higher, reorder('vote_total desc')
end

@random_genres = Genre.random_selection(10)

如果您可以发布一个与此查询相关的表的精简示例,这将非常有用。此外,上述方法采用的是哪种模型?参见两个表格的答案。体裁和媒体媒体通过多对一的方式属于体裁。