DEV Community

Divyakush Punjabi
Divyakush Punjabi

Posted on

Your slow app is probably an N+1 query

Your app got slow and nobody changed the servers. The database isn't overloaded. Each individual query is fast. And yet a page that should take 50 milliseconds now takes two seconds. Nine times out of ten, the culprit is the most common performance bug in web development — one so quiet it survives code review, passes every test on a tiny dataset, and only shows its teeth in production. It's the N+1 query, and I've hunted it more than once while building DineGuru.

One query to find them, N queries to describe them

The pattern is innocent-looking. You run one query to fetch a list — say, 50 orders. Then, to show each order's customer, your code loops over the list and quietly fires one more query per order to load that customer. One query became fifty-one. That's the N+1: 1 query for the list, plus N for the details.

It's invisible in development because your test database has five rows, so 6 queries feel instant. In production, the list has thousands of rows, and now you're firing thousands of tiny round-trips to the database. Each one is fast on its own — the killer is that you're doing an absurd number of them, and the network latency to the database, paid thousands of times over, is what drags the page to a crawl.

Ask for everything at once

The fix isn't a faster database or a cache bolted on top — it's asking the right question once instead of the wrong question N times:

  • Fetch related data eagerly. Instead of loading orders and then lazily loading each customer inside a loop, tell the ORM up front that you need the customers too. It fetches them in one additional query (or a single join) — 2 queries total instead of 51.
  • Watch the query count, not just the query time. A slow endpoint with no slow individual query is the signature of N+1. Logging how many queries a request fires is often more revealing than profiling any single one.
  • The loop is the smell. Any time you're iterating over records and touching the database inside the loop, stop — that's almost always N+1 waiting to happen at scale.

The takeaway

The N+1 query is a perfect lesson in why performance bugs hide: nothing is individually slow, nothing errors, and it scales invisibly with data you don't have yet in development. The skill isn't writing exotic optimizations — it's recognizing the pattern, counting your queries, and asking the database for what you need in one trip instead of a thousand.

DineGuru taught me to watch the query count as closely as the query plan. The full backend architecture is on the project page.

👉 See it: www.divyakush.com/projects/dineguru


Divyakush Punjabi — Full-Stack & AI Systems Engineer

🌐 https://www.divyakush.com · 💼 LinkedIn · 💻 GitHub

Top comments (0)