N+1 Problem in ORM
N+1 Problem
Database Performace နဲ့ ပက်သက်လာရင် ORM(object-relational mapping) တွေမှာ ကြုံနေကျ ပြဿနာ တစ်ခုရှိတယ်။ နမူနာ အနေနဲ့ Laravel မှာ Post နဲ့ Comment တွေကို ဖော်ပြပေးတဲ့ နေရာကို ကြည့်ကြည့်ရအောင်။
// Controller မှာ ဒါမျိုး ရေးထားမယ်။
$posts = Post::all();
// View မှာ ဒါမျိုး ရေးမယ်။
@foreach ($posts as $post)
<h2></h2>
<!-- N+1 problem: fetching comments for each post individually -->
@foreach ($post->comments as $comment)
<p></p>
@endforeach
@endforeach
ဒီအတွက် စုစုပေါင်း Query ဘယ်နှစ်ခု run ရမယ် ထင်လဲ?
Post စုစုပေါင်း အရေအတွက် + ၁
ဆိုလိုတာက Post (၁၀)ခု ရှိရင် Query (၁၁) ကြောင်း run ရမယ်။
SELECT * FROM posts;
SELECT * FROM comments WHERE post_id = 1;
SELECT * FROM comments WHERE post_id = 2;
.
.
.
SELECT * FROM comments WHERE post_id = 10;
ဒါမျိုး။
အမှန်ကတော့ (၁) ကြောင်းတည်းနဲ့ ကိစ္စပြတ်သင့်တာ။ ORM တိုင်းမှာ N+1 အတွက် ဖြေရှင်းနည်းတွေရှိပြီး Laravel ရဲ့ Eloquent ORM မှာတော့ ဒါမျိုး ရှင်းလို့ရတယ်။
Controller ကို ဒါမျိုးပြင်ရေးလိုက်မယ်။
// with keyword သုံးပြီး N+1 ပြဿနာကို ဖြေရှင်း
$posts = Post::with('comments')->get();
// View မှာ ဒါမျိုး ရေးမယ်။
@foreach ($posts as $post)
<h2></h2>
<!-- N+1 problem: fetching comments for each post individually -->
@foreach ($post->comments as $comment)
<p></p>
@endforeach
@endforeach
N+1 Problem Solved!
Written on December 19, 2023