N+1問題について勉強会で発表してみた

f:id:ryohei515:20210819203336j:plain

ryohei515です。

Ruby on Railsを使う上で、N+1問題は避けては通れない問題です。

インゲージでは週に1度、社内勉強会を行っているのですが、今週は私が発表担当だったため、このN+1問題を知識整理がてら、社内勉強会で共有しました。

簡単な内容ではありますが、その資料をブログで共有したいと思います。

TL;DR

N+1問題に対しては、これが結論です。

メソッド 結合方法 使用箇所
joins 内部 内部結合で結合先の条件をフィルタしたいとき
left_joins 外部 外部結合で結合先の条件をフィルタしたいとき
preload 外部 結合先のデータを使いたいとき
eager_load 外部 結合先のデータを使いたいかつ、
結合先の抽出条件を指定したいとき
includes 外部 n+1を発生させないようにしたいとき
(できれば preloadeager_load を使う。)

ただ、勉強会では

  • sizecountlength の動きはそれぞれ違うよね。
  • インゲージが提供しているサービス Re:lation だと、 eager_loadpreload 、どっちが早い?
  • パフォーマンスを意識してpluck を使っているけど、結果を hash に加工する gem (pluck_to_hash) を使えば、より使いやすくなりそう!

といった感じで色々な話に派生し、学びの多かった勉強会となりました!

終わりに

こんな技術について語り合う場が欲しいと思っている方はぜひご応募頂けると嬉しいです!

カジュアル面談も可能なので、ぜひ以下からお願いします!

ingage.co.jp