【エンジニア必見】N+1問題の全貌とORMでパフォーマンスを落とさない究極の対策
ORM(Object-Relational Mapper)は開発を効率化しますが、「N+1問題」というパフォーマンスの落とし穴が潜んでいます。この記事では、N+1問題の発生メカニズムと、ORMを使う上で絶対に注意すべき対策を、初心者の方にも分かりやすく解説します。【2026年】の今、パフォーマンス意識の高いエンジニアを目指すための必読知識です。
N+1問題とは何か?
N+1問題とは、データベースから関連するデータを取得する際に、不要なクエリが大量に実行されてしまうパフォーマンス上の課題です。
例えば、ブログの記事(親エンティティ)と、それに紐づくコメント(子エンティティ)があるとします。記事一覧を表示し、各記事のコメント数も表示したい場合を考えます。
- まず、全ての記事を取得するために1つのクエリが実行されます。
SELECT * FROM articles;
- 次に、取得した記事のリストをループで処理し、各記事のコメント数を取得しようとすると、各記事に対して個別にクエリが発行されてしまいます。
SELECT count(*) FROM comments WHERE article_id = A;SELECT count(*) FROM comments WHERE article_id = B;- ... (N回繰り返される)
結果として、親エンティティの取得に1回、子エンティティの取得にN回、合計で「1 + N」回のクエリがデータベースに送られます。Nが増大すればするほど、データベースへの負荷が急増し、アプリケーションの応答速度が著しく低下します。
ORMでN+1問題が発生するメカニズム
多くのORMは、デフォルトで「遅延ロード(Lazy Loading)」という仕組みを採用しています。これは、関連するデータを実際に使用するまでデータベースから読み込まない、という設計思想です。リソースの節約には有効ですが、これがN+1問題の主要な原因となります。
例として、PythonのDjango ORMで見てみましょう。(他のORMでも同様の概念が存在します。)
エンジニアのスキルシェアプラットフォーム「DokuPro」
教えたい人と学びたい人を繋ぐDokuProでは、新規登録(先生・生徒)を募集中です。
詳細はこちら: https://dokupro.dev/