🐥
パフォーマンス問題、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問題とは?
上記コードの動き:
- 最初に
Post.objects.all()
→ 1回のクエリ(N=投稿数) - 各Postごとに
.comments.all()
→ N回のクエリ
👉 結果:合計で1 + N回のクエリが発行される
Eager Loading(事前読み込み)
⚡ 解決方法:例えばDjangoだと:
posts = Post.objects.prefetch_related('comments')
これにより、
- 最初に記事一覧を1回のクエリ
- 次にすべてのコメントを1回のクエリ
合計で2回のクエリだけで済みます。
✅ まとめ:N+1問題とは?
項目 | 内容 |
---|---|
問題の本質 | 1つの親レコードに対して子レコードを都度クエリ |
発生しやすい場面 | ORM使用時、リレーションをループで参照する時 |
影響 | クエリ数が爆発 → レイテンシ増加・DB負荷増大 |
解消法 |
JOIN や Eager Loading (例:includes , preload ) |
興味があれば、RailsやTypeORMなど、他のフレームワークでの例も紹介できますよ。どの言語環境で使いたいですか?
Discussion