Thuta Learning
ရှာဖွေရန်
GraphQL
ExercisesWeb Developmentbeginner

Exercise — N+1 Query Bug ရှာပြီး ပြင်ခြင်း

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Exercise — N+1 Query Bug ရှာပြီး ပြင်ခြင်း concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ GraphQL query/code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Lesson 14 မှာ N+1 problem ရဲ့ root cause (list field တစ်ခုချင်းအတွက် per-item resolver database query သီးခြားခေါ်ခြင်း) ကို လေ့လာခဲ့ပါတယ်။ ဒီ exercise ကတော့ ဒီ pattern ကို code snippet အစစ်တစ်ခုမှာ ကိုယ်တိုင်ရှာပြီး diagnose လုပ်ကာ DataLoader ဖြင့် ပြင်ဆင်ပြီး fix ကို verify လုပ်ကြည့်ဖို့ ဖြစ်ပါတယ်—production debugging မှာ N+1 ကို database query log အရေအတွက် (list size ကြီးလာတာနဲ့အမျှ query count တက်ခြင်း) ကနေလည်း သတိထားမိနိုင်ပါတယ်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform ရဲ့ `Tutorial.author` resolver ကနေ tutorials list တစ်ခု fetch လုပ်တိုင်း database query log ထဲမှာ `SELECT * FROM authors WHERE id = ?` ဟာ tutorial count နဲ့ တူညီအောင် repeat ဖြစ်နေတာကို တွေ့ရပါတယ်—ဒီ bug ကို ဖော်ထုတ်ပြီး `authorLoader` ဖြင့် batch query တစ်ခုတည်းသို့ ပြောင်းရမယ်။

အတူတူ စမ်းရေးကြည့်မယ်

javascript
// Buggy: fires one query per tutorial
const resolvers = {
  Tutorial: {
    author: async (tutorial) => {
      return db.author.findUnique({ where: { id: tutorial.authorId } });
    },
  },
};

// Your task: rewrite this resolver to use a DataLoader
// so N tutorials cause exactly one authors query.
You should see
N+1 bug ကို resolver code ထဲကနေ ဖော်ထုတ်ပြီး DataLoader-based fix ကို ကိုယ်တိုင်ရေးနိုင်မည်။

၅ မိနစ် စမ်းကြည့်

အပေါ်က buggy resolver ကို `authorLoader` (lesson 14 က ဥပမာအတိုင်း) သုံးပြီး ပြန်ရေးပါ။ ပြင်ပြီးနောက် tutorials 10 ခုအတွက် author queries အရေအတွက် ဘယ်လောက်ဖြစ်သွားမလဲ ရေးပါ။

သတိလေးတစ်ချက်

Fix အနေနဲ့ resolver ထဲမှာ simple in-memory object cache (request boundary မရှိ) ကိုသုံးမိရင် request အသစ်တိုင်း stale data ဆက်ပြနေနိုင်ပါတယ်—DataLoader instance ကို context ထဲက request-scoped ဖြစ်အောင် ထားပါ။

Apollo Server — Batching with DataLoaderGraphQL

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Fix အနေနဲ့ resolver ထဲမှာ simple in-memory object cache (request boundary မရှိ) ကိုသုံးမိရင် request အသစ်တိုင်း stale data ဆက်ပြနေနိုင်ပါတယ်—DataLoader instance ကို context ထဲက request-scoped ဖြစ်အောင် ထားပါ။
  • နမူနာ query/mutation ကို production API ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test server နှင့် recoverable data ပေါ်တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

အပေါ်က buggy resolver ကို `authorLoader` (lesson 14 က ဥပမာအတိုင်း) သုံးပြီး ပြန်ရေးပါ။ ပြင်ပြီးနောက် tutorials 10 ခုအတွက် author queries အရေအတွက် ဘယ်လောက်ဖြစ်သွားမလဲ ရေးပါ။

You'll know it worked when: N+1 bug ကို resolver code ထဲကနေ ဖော်ထုတ်ပြီး DataLoader-based fix ကို ကိုယ်တိုင်ရေးနိုင်မည်။

Exercise — N+1 Query Bug ရှာပြီး ပြင်ခြင်း | Thuta Learning