技術的な質問(A)

  • N + 1つの問題

N + 1つの質問:
    何である:例えば、リストの関係がテーブルBからクエリを実行する必要がn回ため(プライマリ・テーブル)合計クエリ、実行するn個のデータ取得の一次表A一度、(表から)リストB関連付けられています番号n + 1。パフォーマンスの問題を引き起こしてテーブルの上に複数のクエリ、これは、n + 1つの問題です。
    理由:メインテーブルクエリは一度だけ、本当にパフォーマンスの問題を引き起こして、テーブルから関連するクエリに一つずつ、n回を必要としています。
    溶液:(1)いい加減:再クエリと時間
    (2)レールが解決策をお勧めは:(予圧とeager_loadを含み、事前にロードすることができる);交差点に、ジョイン内であるジョインテーブルから供給含みます   

#n+1问题
User.all.each do |user|
  p user.blogs
end

#查询user表时,把includes进blogs
User.includes(:blogs).each  do |user|
  p user.blogs
end

#使用joins,会产生重复记录,可以用uniq去除
User.joins(:blogs) 或Blog.joins(:user)
#select users.* from users inner joins blogs on users.id=blogs.user_id
#select blogs.* from blogs inner joins users ...
#另外:使用joins关联多个对象
User.joins(:blogs,:articles)  <===> User.joins(:blogs).joins(:articles) 
#select users.* from users 
#inner joins blogs on users.id=blogs.user_id
#inner joins articles on users.id=articles.user_id

 

リリース7件のオリジナルの記事 ウォンの賞賛0 ビュー68

おすすめ

転載: blog.csdn.net/qq_33728961/article/details/104032024