Rails5.1.1 包含 + map 功能将极慢约 15 秒



如果用户模型包含多表并使用map,它真的会变慢!!它可能是大约11s~20s。

在控制台中,我观看了日志打印,当sql包含时它总是很慢,并且在打印出sql查询日志完成后,它将非常快速地运行。

这个函数只用于将数据导出到excel,所以很少使用导致我不想在这种情况下使用计数器缓存。

Benchmark.bm do |x| 
   x.report { 
     User.includes(:active_goal, :notification_setting, :reviews, 
     :comments, :answers, :quiz_answers).map(&:id) do |user|
        [
          user.active_goal.try(:name),
          user.notification_setting&.is_need_notify || false,
          user.reviews.size,
          user.comments.size,
          assignment_reviews(user.answers),
          right_ratio(user.quiz_answers)
        ]
      end
   }
   x.report { 
     User.includes(:active_goal, :notification_setting, :reviews, 
     :comments, :answers, :quiz_answers) 
    }
end
Benchmark::Tms: @real=14.244344999955501, @stime=0.45999999999999996, @total=13.05, @utime=12.59
Benchmark::Tms: @real=0.00010500004282221198, @stime=0.0, @total=0.0, @utime=0.0
@users.size = 887
QuizAnswer.all.size = 71386   
Goal.all.size = 1519    
NotificationSetting.all.size = 928    
Review.all.size = 10
Comment.all.size = 6664
Answer.all.size = 98
Ruby 2.4.1p111

顺便说一下,这些表我已经做了id索引。

还是不知道是什么问题。

有人可以请帮助我或分享我如何加快速度吗?

使用 .pluck(:id) 代替.map(&:id)这会更快。

最新更新