🐥

パフォーマンス問題、N+1って何?

に公開

N+1問題とは、データベースに対するクエリが無駄に多く発行されることで、パフォーマンスが著しく悪化する現象です。特に**ORM(Object-Relational Mapping)**を使っているときによく起きます。


🔧 具体例で説明(例:ブログ記事とそのコメント)

たとえば、以下のような構造のデータがあるとします:

  • 記事(Post): 複数ある
  • コメント(Comment): 各記事に複数つく
# Python + Django的な例
posts = Post.objects.all()  # 記事を全件取得

for post in posts:
    comments = post.comments.all()  # 各記事に対してコメントを取得

😱 N+1問題とは?

上記コードの動き:

  1. 最初に Post.objects.all()1回のクエリ(N=投稿数)
  2. 各Postごとに .comments.all()N回のクエリ

👉 結果:合計で1 + N回のクエリが発行される


⚡ 解決方法:Eager Loading(事前読み込み)

例えばDjangoだと:

posts = Post.objects.prefetch_related('comments')

これにより、

  • 最初に記事一覧を1回のクエリ
  • 次にすべてのコメントを1回のクエリ

合計で2回のクエリだけで済みます。


✅ まとめ:N+1問題とは?

項目 内容
問題の本質 1つの親レコードに対して子レコードを都度クエリ
発生しやすい場面 ORM使用時、リレーションをループで参照する時
影響 クエリ数が爆発 → レイテンシ増加・DB負荷増大
解消法 JOINEager Loading(例:includes, preload

興味があれば、RailsやTypeORMなど、他のフレームワークでの例も紹介できますよ。どの言語環境で使いたいですか?

Discussion