0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【エンジニア必見】N+1問題の全貌とORMでパフォーマンスを落とさない究極の対策

0
Posted at

【エンジニア必見】N+1問題の全貌とORMでパフォーマンスを落とさない究極の対策

ORM(Object-Relational Mapper)は開発を効率化しますが、「N+1問題」というパフォーマンスの落とし穴が潜んでいます。この記事では、N+1問題の発生メカニズムと、ORMを使う上で絶対に注意すべき対策を、初心者の方にも分かりやすく解説します。【2026年】の今、パフォーマンス意識の高いエンジニアを目指すための必読知識です。

N+1問題とは何か?

N+1問題とは、データベースから関連するデータを取得する際に、不要なクエリが大量に実行されてしまうパフォーマンス上の課題です。

例えば、ブログの記事(親エンティティ)と、それに紐づくコメント(子エンティティ)があるとします。記事一覧を表示し、各記事のコメント数も表示したい場合を考えます。

  1. まず、全ての記事を取得するために1つのクエリが実行されます。
    • SELECT * FROM articles;
  2. 次に、取得した記事のリストをループで処理し、各記事のコメント数を取得しようとすると、各記事に対して個別にクエリが発行されてしまいます。
    • 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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?