PostgreSQL · MySQL · MongoDB · Redis · SQL Server · Aurora

Database Troubleshooting: Find Out Why Your Database Is Slow or Down

Queries that used to run in milliseconds now take seconds. CPU pegged at 100% during your busiest hour. An outage at 3am with no clear cause. We diagnose what's actually wrong — across PostgreSQL, MySQL, MongoDB, Redis, SQL Server, and their managed-cloud equivalents — and hand you a fix plan with the tradeoffs named, not a sales pitch for a retainer.

Read-only first
how we start every engagement
PostgreSQL · MySQL · MongoDB · Redis · SQL Server
databases we work in
Root cause
in writing, not a guess
One-time or ongoing
your call after the diagnostic

What These Symptoms Usually Mean

A database is usually slow, crashing, or unstable because of a small, findable set of causes — a missing index, a connection pool sized for the wrong load, lock contention between competing queries, stale planner statistics, or a replication setup falling behind under write pressure. Database troubleshooting is the process of tracing a symptom back to the specific mechanism causing it — using query plans, lock graphs, and metrics — so the fix addresses the cause instead of buying a few quiet hours before it happens again.

A query that ran fine for two years suddenly takes forty seconds. Your app times out during your busiest hour, every week, like clockwork. Replication lag keeps climbing no matter what you restart. Something paged you at 3am, you bounced the service, and you still don't know why — or whether it'll happen again tonight.

These symptoms feel random. They almost never are. Most of them trace back to a short list of root causes: a missing index on a foreign key, a connection pool that's too small, lock contention between two queries that were never supposed to collide, planner statistics that went stale after a bulk load, or a schema change that looked harmless in staging and wasn't.

The fix is rarely "add more hardware." It's finding the one or two things actually causing the problem — which takes someone who's looked at hundreds of these, not a guess-and-restart cycle that buys you a few quiet days before it happens again.

Signs You Need a Diagnosis, Not Another Restart
  • The same alert pages you every week, and restarting fixes it — for a few days
  • A query that ran fine for months suddenly takes ten times as long
  • Replication lag keeps growing no matter what you restart
  • CPU or connections spike at the same time every day and nobody knows why
  • An outage happened and the postmortem ended at 'we restarted it'
  • You're about to migrate or upgrade and don't know what's going to break

Decisions We Help You Get Right

Hiring outside help for a database problem comes with its own questions. Here's how we think through the ones that come up most.

One-time fix vs. ongoing retainer

Most teams that come to us with an active problem just need that problem solved — a diagnostic engagement, a report, a fix plan, done. Ongoing coverage makes sense once you know you want continuous monitoring and a faster response time than you can build in-house. We don't push you toward the bigger commitment before you've seen what the smaller one delivers.

Read-only access vs. write access

We start with slow query logs, performance schema exports, or a read replica connection — enough to find the root cause without touching production. Write access only enters the picture once we've agreed on exactly what changes, how, and when, through whatever access process you already run (VPN, bastion host, MFA, IP allowlisting).

We implement it vs. you do

Some clients take the written fix plan and execute it with their own team — the report is written for that. Others ask us to implement it directly, especially under time pressure. Both are normal outcomes of the same engagement; we size the proposal to whichever you choose, not the other way around.

Bring in outside help vs. trust your own team

Not a competition — a second set of eyes that's diagnosed this exact failure pattern elsewhere tends to find the root cause faster, simply because pattern-matching across many environments is a different skill than knowing one environment deeply. We work alongside your engineers and write the report for them, not around them.

What a Diagnostic Engagement Delivers

A Root Cause, Not a Guess

We trace the symptom back to the mechanism causing it — a missing index, a connection storm, lock contention, stale planner statistics — using query plans and metrics, not trial and error.

A Report Your Team Can Read and Act On

Plain-language explanation of what's wrong, the evidence behind it, and a fix plan with the tradeoffs named — yours to keep, implement yourself, or hand to whoever owns the database.

No Retainer Required

This is a one-time engagement. You get a diagnosis and a plan. Whether you implement it yourself, ask us to do it, or move to ongoing coverage afterward is entirely your call.

Common Failure Patterns, By Database

Tell us what you're running. These are the patterns we see most often in each — yours may be one of these, or something this list helps you describe more precisely.

PostgreSQL
Sequential scans on tables that should use an index, autovacuum falling behind into bloat, replication lag under write load, connection pool exhaustion, lock waits between writes and long reports
MySQL
Replica lag during peak write periods, lock waits and deadlocks under concurrency, an InnoDB buffer pool sized for a smaller database, schema migrations that lock entire tables on deploy
MongoDB
Aggregation pipelines scanning full collections instead of using indexes, working sets larger than available RAM, replica set elections triggered by resource pressure, queries that degrade sharply past a certain scale
Redis
Evictions under memory pressure with a mismatched policy, slow commands blocking the single-threaded event loop, persistence (RDB/AOF) causing latency spikes, cluster failover that behaves differently than the runbook assumes
SQL Server
Blocking chains and deadlocks on overlapping read/write workloads, query plan regressions after a statistics update, TempDB contention under load, index fragmentation maintenance jobs aren't actually fixing
Aurora, RDS, Cloud SQL & managed equivalents
Failover behavior that doesn't match the documentation, parameter groups copied from a different workload profile, storage or I/O throttling under sustained load, connection limits hit during traffic spikes
pgvector & vector search
Similarity search that was fast at 100K rows and isn't at 10M, an index type (HNSW vs. IVFFlat) mismatched to the workload, embedding dimension and storage choices that weren't sized for the growth that followed

Four Kinds of Problems We Get Called For

Performance Diagnosis

Slow query analysis with EXPLAIN ANALYZE, pg_stat_statements, or your slow query log. Index review — what's missing, what's unused, what's slowing down writes. Query plan regression hunting and lock/blocking analysis.

Outage & Crash Triage

Root-cause analysis after an incident — reconstructing the timeline from logs and metrics, not stopping at 'we restarted it.' Replication failure recovery and connection storm post-mortems.

Capacity & Scaling Assessment

Read replica strategy, connection pooling design (PgBouncer, ProxySQL, RDS Proxy) sized to your real concurrency, partitioning and sharding evaluation, and instance right-sizing based on actual usage.

Migration & Upgrade Health Checks

Pre-migration schema review, post-migration performance comparison with evidence, replication lag monitoring during cutover, and version upgrade risk assessment (Postgres 14 → 17, MySQL 5.7 → 8, and similar jumps).

What Happens After You Reach Out

Read-only access first

We start by looking, not changing — slow query logs, pg_stat_statements exports, monitoring dashboards, or a read-only replica connection. Most of what we need to find the root cause doesn't require write access.

A root-cause report you can read

Not a wall of metrics — a written explanation of what's actually causing the symptom, with the evidence behind it (query plans, lock graphs, the specific operations involved), translated into plain language.

A fix plan with the tradeoffs named

'Add this index — it costs you this much disk and write overhead, and speeds up these four queries.' 'Add a read replica — here's what that does and doesn't solve.' You decide what to do with that information.

Implementation, your call

Some clients take the report and fix it themselves. Some ask us to implement it. Some move to an ongoing Managed DBA retainer afterward. All three are normal outcomes — the diagnostic isn't a funnel into a contract.

Frequently Asked Questions

Start With a Free Database Diagnostic

Tell us what's happening — the symptom, when it started, what you've already tried. We'll tell you, honestly, whether it sounds like something we can pin down quickly or something that needs a longer look, before you spend anything.

The Problem That Paged You Last Night Will Page You Again

Restarting the service buys you a few quiet days. It doesn't tell you what's actually wrong, or stop it from happening again at the worst possible time. Find out what's really causing it — in writing — before the next page comes in.