【いーがーろーでぃんぐ】
イーガーローディング とは?
最終更新:
💡 必要なデータをまとめて先取り、N+1問題の特効薬
ORMで、関連するデータを使う前にまとめて取得しておく手法。関連データを1件ずつ取りに行くN+1問題を防ぎ、データベースへのクエリ回数を減らせる。
📌 このページのポイント
イーガーローディングって何を積極的に読み込むの?
関連テーブルのデータだよ。たとえばブログ記事の一覧を取得するとき、各記事の著者情報も最初にまとめて取得しておくのがイーガーローディングなんだ
まとめて取得しないとどうなるの?
イーガーローディングだと何回になるの?
includesはJOINとIN句のどっちを使うの?
Railsのincludesは状況に応じて選ぶよ。基本は別クエリで読み込むpreloadの動きで、関連テーブルの列を条件に使う場合などはLEFT OUTER JOINで読み込むeager_loadの動きになる。明示したいときはpreloadやeager_loadを直接使えるんだ
全部イーガーにしちゃえばいいんじゃない?
使わない関連まで取得すると、メモリや時間の無駄になるよ。RailsのBulletというGemは、N+1だけでなく「読み込んだのに使われていないイーガーローディング」も開発中に知らせてくれるんだ。画面で本当に使う関連だけを指定するのが大事だね
もっと詳しく知りたい人へ
うっかりN+1を書いてしまうのを防ぐ方法はある?
フレームワークの機能で、遅延読み込みが起きたらエラーにできるよ。Railsではstrict_loadingを使うと、読み込んでいない関連にアクセスしたときにActiveRecord::StrictLoadingViolationErrorが発生する。LaravelではModel::preventLazyLoading()を設定すると、遅延読み込みでLazyLoadingViolationExceptionが発生する。公式ドキュメントの例のように本番以外の環境で有効にして、開発やテスト中に見つけるのが一般的な使い方だよ。
まとめ:ざっくりこれだけ覚えればOK!
「イーガーローディング」って出てきたら「関連データをまとめて先に読み込む手法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Eager Loading」 = 積極的な読み込み
💬 Eager は「熱心な・積極的な」という意味で、先回りしてデータを読み込むイメージだよ