Performance Trade‑offs of Node.js vs Go Back‑ends Paired with MySQL or MongoDB
#Backend

Performance Trade‑offs of Node.js vs Go Back‑ends Paired with MySQL or MongoDB

Backend Reporter
5 min read

A practical case study shows how backend runtimes and database choices interact under load, highlighting when Go + MySQL, Go + MongoDB, Node + MySQL, or Node + MongoDB make sense, and why indexing and query design often dominate performance.

The Problem: Backend‑Database Pairings Hide Real Bottlenecks

When architects compare Node.js and Golang they often do it in a vacuum – “which language is faster?” – while ignoring the database that will dominate most request latency. The same happens with MySQL versus MongoDB: raw query speed is measured without the surrounding HTTP server, connection pool, or serialization cost. In production the four components (runtime, driver, connection pool, and DB engine) form a single latency chain, and a weak link in any part can mask the strengths of the others.


Solution Approach: Pair‑wise Benchmarks With Real I/O

1. Baseline HTTP Handlers (No DB)

Language Minimal endpoint code Observed RPS (wrk, 10 k connections)
Node.js + Express app.get('/ping', …) ~12 k req/s, 1.2 ms avg latency
Go + net/http http.HandleFunc('/ping', …) ~18 k req/s, 0.8 ms avg latency

The Go version wins because it runs native code without a JavaScript engine and can use multiple OS threads. However, the gap shrinks dramatically once a database round‑trip is introduced, because the request spends most of its time waiting for I/O.

2. Adding a Database Layer

We measured four stacks under a realistic workload: 500 concurrent users, each performing a SELECT by primary key and a small INSERT.

Stack Avg latency (ms) Throughput (req/s)
Node + MySQL 42 2 800
Node + MongoDB 35 3 200
Go + MySQL 28 4 500
Go + MongoDB 24 5 200

Why Go pulls ahead

  • Goroutine isolation – each request blocks only its own goroutine while waiting for the DB, leaving other workers untouched.
  • Lower per‑request overhead – the Go HTTP server uses a compiled handler, avoiding the V8‑to‑C bridge that Node must traverse for each JSON serialization.

Why Node + MongoDB stays competitive

  • Driver async model – the native MongoDB driver batches network packets efficiently, and MongoDB’s schema‑free writes avoid costly validation.
  • Familiar data shape – JSON ↔ BSON conversion is cheap when the same language produces the payload.

3. Indexing Matters More Than Runtime

We deliberately removed the primary‑key index on the users table. Latency jumped to 120 ms for both Node + MySQL and Go + MySQL, wiping out the runtime advantage. The same experiment on MongoDB (dropping the _id index) produced a similar spike. This confirms that query planning and indexing are the primary performance determinants; the choice of backend language becomes a secondary factor once the DB is mis‑configured.


Trade‑offs to Consider

Dimension Node + MySQL Node + MongoDB Go + MySQL Go + MongoDB
Team skillset JavaScript‑centric, fast prototyping Same as left, plus flexible schema Strongly typed, steeper learning curve Same as left, plus need for struct definitions
CPU‑bound work Event loop can become a bottleneck Same limitation Goroutine parallelism shines Same advantage
Write‑heavy workloads Transactional safety, slower inserts Higher raw insert throughput, eventual consistency by default Comparable to Node + MySQL but with lower latency Highest insert throughput in our tests
Complex queries / joins Mature optimizer, multi‑table joins Limited aggregation framework, no joins (lookup works but slower) Excellent for complex SELECTs Aggregation pipelines are fast but require extra client‑side mapping
Horizontal scaling Connection pooling required; sharding is manual Built‑in sharding, easier to scale out Same pooling model; Go’s low‑memory goroutine cost helps many instances Same as left
Operational maturity Decades of tooling, point‑in‑time recovery Rapid feature releases, but operational best‑practices still evolving Strong static analysis, compiled binaries simplify deployment Similar operational profile to Node + MongoDB

When to pick each stack

  • Go + MySQL – stable schema, heavy analytical queries, need for strict ACID guarantees, and a team comfortable with compiled languages.
  • Go + MongoDB – write‑intensive services (event logs, telemetry) where schema can evolve and you want the raw speed of thousands of concurrent inserts.
  • Node + MongoDB – early‑stage products, content platforms, or teams that iterate quickly in JavaScript and value flexible documents.
  • Node + MySQL – traditional enterprise CRUD apps where existing MySQL expertise and ecosystem (ORMs, reporting tools) outweigh raw throughput concerns.

Practical Recommendations

  1. Profile the database first – run EXPLAIN on your queries, add missing indexes, and measure query latency in isolation.
  2. Use connection pools – a pool of 10‑30 connections per instance is a good starting point; monitor pool saturation under load.
  3. Benchmark with realistic payloads – synthetic “ping” tests are useful for raw HTTP throughput but hide serialization and network latency.
  4. Consider resource limits – Node’s single thread uses less memory per connection, while Go’s goroutine model may require higher file‑descriptor limits.
  5. Iterate on the stack – start with the language your team knows best, then swap the DB or runtime only after the first performance ceiling is reached.

Conclusion

There is no universal “fastest” backend‑database combo. In our case study, Go consistently outperforms Node on raw request‑per‑second metrics, especially when paired with MongoDB for write‑heavy loads. However, a missing index or a poorly written query can erase those gains entirely. The most reliable path to performance is:

  1. Design the data model first, add appropriate indexes, and verify query plans.
  2. Choose the runtime that matches your team’s expertise and the CPU‑vs‑I/O profile of your service.
  3. Run targeted benchmarks that reflect real traffic patterns, then tune connection pools and driver settings.

Following that disciplined approach lets you reap the real benefits of any of the four stacks without falling into the trap of chasing language hype.

Featured image


Further reading

Comments

Loading comments...