[{"data":1,"prerenderedAt":302},["ShallowReactive",2],{"term-n\u002Fn-1-query":3,"related-n\u002Fn-1-query":288},{"id":4,"title":5,"acronym":6,"body":7,"category":270,"description":271,"difficulty":272,"extension":273,"letter":274,"meta":275,"navigation":187,"path":276,"related":277,"seo":282,"sitemap":283,"stem":286,"subcategory":6,"__hash__":287},"terms\u002Fterms\u002Fn\u002Fn-1-query.md","N+1 Query",null,{"type":8,"value":9,"toc":264},"minimark",[10,15,19,23,26,30,253,257,260],[11,12,14],"h2",{"id":13},"eli5-the-vibe-check","ELI5 — The Vibe Check",[16,17,18],"p",{},"N+1 is when your code runs 1 query to get a list of things, then runs 1 more query for EACH thing on the list. Get 100 posts, then query comments 100 times — that is 101 queries instead of 2. Your app slows to a crawl. Super common ORm mistake.",[11,20,22],{"id":21},"real-talk","Real Talk",[16,24,25],{},"The N+1 query problem occurs when code fetches a list of N records (1 query) then executes an additional query for each record to fetch related data (N queries), totaling N+1 queries. It is a common performance problem with ORMs. Solutions include eager loading (JOIN or IN clause) to fetch all related data in fewer queries.",[11,27,29],{"id":28},"show-me-the-code","Show Me The Code",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F BAD: N+1 (100 users = 101 queries)\nconst users = await db.users.findMany();\nfor (const user of users) {\n  const orders = await db.orders.findMany({ where: { userId: user.id } });\n}\n\n\u002F\u002F GOOD: 2 queries\nconst users = await db.users.findMany({\n  include: { orders: true }  \u002F\u002F Eager load\n});\n","javascript","",[38,39,40,49,89,112,176,182,189,195,220,243],"code",{"__ignoreMap":36},[41,42,45],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sHwdD","\u002F\u002F BAD: N+1 (100 users = 101 queries)\n",[41,50,52,56,60,64,68,71,74,77,79,83,86],{"class":43,"line":51},2,[41,53,55],{"class":54},"spNyl","const",[41,57,59],{"class":58},"sTEyZ"," users ",[41,61,63],{"class":62},"sMK4o","=",[41,65,67],{"class":66},"s7zQu"," await",[41,69,70],{"class":58}," db",[41,72,73],{"class":62},".",[41,75,76],{"class":58},"users",[41,78,73],{"class":62},[41,80,82],{"class":81},"s2Zo4","findMany",[41,84,85],{"class":58},"()",[41,87,88],{"class":62},";\n",[41,90,92,95,98,100,103,106,109],{"class":43,"line":91},3,[41,93,94],{"class":66},"for",[41,96,97],{"class":58}," (",[41,99,55],{"class":54},[41,101,102],{"class":58}," user ",[41,104,105],{"class":62},"of",[41,107,108],{"class":58}," users) ",[41,110,111],{"class":62},"{\n",[41,113,115,118,121,124,126,128,130,133,135,137,141,144,147,150,153,156,158,161,163,166,169,171,174],{"class":43,"line":114},4,[41,116,117],{"class":54},"  const",[41,119,120],{"class":58}," orders",[41,122,123],{"class":62}," =",[41,125,67],{"class":66},[41,127,70],{"class":58},[41,129,73],{"class":62},[41,131,132],{"class":58},"orders",[41,134,73],{"class":62},[41,136,82],{"class":81},[41,138,140],{"class":139},"swJcz","(",[41,142,143],{"class":62},"{",[41,145,146],{"class":139}," where",[41,148,149],{"class":62},":",[41,151,152],{"class":62}," {",[41,154,155],{"class":139}," userId",[41,157,149],{"class":62},[41,159,160],{"class":58}," user",[41,162,73],{"class":62},[41,164,165],{"class":58},"id",[41,167,168],{"class":62}," }",[41,170,168],{"class":62},[41,172,173],{"class":139},")",[41,175,88],{"class":62},[41,177,179],{"class":43,"line":178},5,[41,180,181],{"class":62},"}\n",[41,183,185],{"class":43,"line":184},6,[41,186,188],{"emptyLinePlaceholder":187},true,"\n",[41,190,192],{"class":43,"line":191},7,[41,193,194],{"class":47},"\u002F\u002F GOOD: 2 queries\n",[41,196,198,200,202,204,206,208,210,212,214,216,218],{"class":43,"line":197},8,[41,199,55],{"class":54},[41,201,59],{"class":58},[41,203,63],{"class":62},[41,205,67],{"class":66},[41,207,70],{"class":58},[41,209,73],{"class":62},[41,211,76],{"class":58},[41,213,73],{"class":62},[41,215,82],{"class":81},[41,217,140],{"class":58},[41,219,111],{"class":62},[41,221,223,226,228,230,232,234,238,240],{"class":43,"line":222},9,[41,224,225],{"class":139},"  include",[41,227,149],{"class":62},[41,229,152],{"class":62},[41,231,120],{"class":139},[41,233,149],{"class":62},[41,235,237],{"class":236},"sfNiH"," true",[41,239,168],{"class":62},[41,241,242],{"class":47},"  \u002F\u002F Eager load\n",[41,244,246,249,251],{"class":43,"line":245},10,[41,247,248],{"class":62},"}",[41,250,173],{"class":58},[41,252,88],{"class":62},[11,254,256],{"id":255},"when-youll-hear-this","When You'll Hear This",[16,258,259],{},"\"The ORM was generating an N+1 query and making 500 database calls per page load.\" \u002F \"Fix N+1 by using include\u002Feager loading.\"",[261,262,263],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":36,"searchDepth":51,"depth":51,"links":265},[266,267,268,269],{"id":13,"depth":51,"text":14},{"id":21,"depth":51,"text":22},{"id":28,"depth":51,"text":29},{"id":255,"depth":51,"text":256},"database","N+1 is when your code runs 1 query to get a list of things, then runs 1 more query for EACH thing on the list.","intermediate","md","n",{},"\u002Fterms\u002Fn\u002Fn-1-query",[278,279,280,281],"Eager Loading","Lazy Loading","Query Optimization","Explain Plan",{"title":5,"description":271},{"changefreq":284,"priority":285},"weekly",0.7,"terms\u002Fn\u002Fn-1-query","aLE0gG0mkpqUXkx6cVhDLe_mWD4tyUnZAmNe1x_QUeM",[289,292,296,299],{"title":278,"path":290,"acronym":6,"category":270,"difficulty":272,"description":291},"\u002Fterms\u002Fe\u002Feager-loading","Eager loading fetches all the related data you need upfront in one or two queries.",{"title":281,"path":293,"acronym":6,"category":270,"difficulty":294,"description":295},"\u002Fterms\u002Fe\u002Fexplain-plan","advanced","EXPLAIN shows you exactly how the database plans to execute your query — which indexes it uses, how many rows it scans, where it is slow.",{"title":279,"path":297,"acronym":6,"category":270,"difficulty":272,"description":298},"\u002Fterms\u002Fl\u002Flazy-loading","Lazy loading waits until you actually access related data before fetching it. Access post.author and only then does it query the database.",{"title":280,"path":300,"acronym":6,"category":270,"difficulty":294,"description":301},"\u002Fterms\u002Fq\u002Fquery-optimization","Query optimization is the art of making slow database queries fast. Add an index here, rewrite that subquery as a JOIN, fetch only the columns you need.",1776518296710]