Ruby on Railsでアプリ作成中です。
GemのBulletを導入してN+1問題があればすぐに発見して解決出来るようにしています。
今回N+1問題が出た時と、出なかった時のSQLの実行ログを比較した所、
N+1問題が発生した時には最後のCACHE Userの1行が新しく出ていました。
User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 Moge Load (0.6ms) SELECT `moges`.* FROM `moges` WHERE `moges`.`id` = 1 LIMIT 1 Hoge Load (0.8ms) SELECT `hoges`.* FROM `hoges` WHERE `themes`.`meeting_id` = 1 User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 CACHE User Load (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 [["id", 1], ["LIMIT", 1]]
Controller
@moge = Moge.find(1)
view
@moge.hoges.each do |hoge| hoge.user
ここで取得しているレコードは2件です
N+1問題発生時は無駄なSQL文が走る、という認識以上のものがないのですが、
ここの問題となるCACHE User
とは何が原因で引き起こされているのでしょうか?
また、UserではなくCACHE Userであれば、「無駄に新しくSQLを叩く」というよりも「CACHEされたUserをLoadしている」、というN+1とは真逆の印象を受けるのですが違うのでしょうか?
よろしくお願いします。
あなたの回答
tips
プレビュー