Blog
monitoringUgur Demirel8. september 20268 min. læsetid

Sådan overvåger du database query performance: find og fix langsomme queries, før de rammer dine brugere

Langsomme queries er en af de mest almindelige årsager til downtime og dårlig performance — og de forbliver usynlige, indtil nogen opdager dem. Lær hvilke metrics der betyder noget, den præcise SQL der afslører dem i PostgreSQL og MySQL, og hvordan du overvåger din database døgnet rundt.

Sådan overvåger du database query performance: find og fix langsomme queries, før de rammer dine brugere

En langsom side er sjældent en langsom side. Det meste af tiden er det en langsom query. Din applikation kan være veldesignet, din cache kan være varm, og dit frontend kan være hurtigt — men ét manglende index eller én uoptimeret query kan forvandle en 50-millisekunders forespørgsel til en 5-sekunders timeout. I modsætning til et hårdt crash dukker en langsom query sjældent op i en error log. Den forringer stille og roligt oplevelsen, indtil brugerne forlader siden.

At overvåge database query performance er noget andet end at holde øje med, om din database er oppe. Begge dele betyder noget, men de besvarer forskellige spørgsmål. Denne guide gennemgår de metrics, der afslører langsomme queries, den præcise SQL til at finde dem i PostgreSQL og MySQL, og hvordan du holder vagt døgnet rundt.

To forskellige spørgsmål: Er den oppe, og er den hurtig?

Database monitoring deler sig i to lag. Availability monitoring besvarer et simpelt spørgsmål: kan din applikation stadig nå databasen, og svarer den inden for rimelig tid? Query performance monitoring besvarer et sværere spørgsmål: hvilke queries er langsomme, hvorfor er de langsomme, og bliver de værre, efterhånden som data vokser? Du har brug for begge dele — en database kan være fuldt tilgængelig, mens en enkelt løbsk query tvinger din applikation i knæ.

De metrics, der virkelig betyder noget

Før du går på jagt efter langsomme queries, skal du beslutte, hvad du måler. Disse tal adskiller en sund database fra en, der er ved at forårsage en incident:

  • Query latency — hvor lang tid en query tager, rapporteret som p50, p95 og p99. En p50 på 10 ms med en p99 på 3 sekunder betyder, at de fleste brugere har det fint, men nogle få venter.
  • Throughput (QPS) — queries pr. sekund. Et pludseligt spids kan afsløre en ny funktion eller en støjende nabo på delt infrastruktur.
  • Slow query rate — andelen af queries, der overskrider din tærskel (for eksempel 500 ms). Det er det tal, der først bør alarmere dig.
  • Connection pool-mætning — når alle forbindelser er optaget, venter nye forespørgsler. Høj ventetid er ofte et symptom på langsomme queries, ikke mangel på forbindelser.
  • Lock- og deadlock-hændelser — en enkelt langvarig transaktion kan blokere alt bag sig.

Find langsomme queries i PostgreSQL

PostgreSQL har ét værktøj, der klarer det meste af arbejdet: udvidelsen pg_stat_statements. Den registrerer aggregerede statistikker for hver query, der kører, herunder samlet tid, gennemsnitstid og antallet af kald. Aktivér den én gang, og du får en permanent rangliste over dine langsomste queries.

  • Aktivér udvidelsen: kør CREATE EXTENSION IF NOT EXISTS pg_stat_statements;, tilføj den til shared_preload_libraries, og genstart serveren.
  • Rangér dine langsomste queries efter gennemsnitstid: SELECT query, calls, mean_exec_time, max_exec_time FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;
  • Zoom ind på en enkelt query med EXPLAIN ANALYZE. Den kører queryen og viser planen, så du kan se, om den bruger et index eller foretager en fuld tabelscanning.
  • Hold øje med Seq Scan på en stor tabel, en stor forskel mellem estimerede og faktiske rækker og dyre sorteringer — de tre mest almindelige årsager til langsomme PostgreSQL-queries.

Find langsomme queries i MySQL

MySQL fører en slow query log, som du kan aktivere med få indstillinger. Den fanger hver query, der kører længere end long_query_time, hvilket gør den til den hurtigste måde at finde dine værste syndere på uden at tilføje et monitoring-værktøj.

  • Aktivér den: SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; find derefter filen med SHOW VARIABLES LIKE 'slow_query_log_file';
  • Inspicér en plan med EXPLAIN på enhver SELECT. Se på kolonnen type — ALL betyder fuld tabelscanning, normalt det, der skal rettes.
  • Tjek index-dækning med SHOW INDEX FROM your_table; og led efter manglende eller ubrugte indexes.
  • Hold øje med Threads_running og Threads_connected i SHOW STATUS; et stigende antal kørende threads betyder ofte, at langsomme queries holder forbindelser åbne.

Ret årsagen, ikke symptomet

At finde en langsom query er kun halvdelen af arbejdet. Rettelserne falder typisk i nogle få velkendte kategorier:

  • Manglende index — den mest almindelige årsag. Et index på dine WHERE- og JOIN-kolonner gør ofte en fuld scanning til nogle få millisekunder.
  • N+1-problemet — en ORM, der kører én query pr. række i stedet for én for hele sættet. Kig efter mange små, næsten identiske queries i dine logs.
  • Over-fetching — at vælge kolonner, du aldrig bruger, eller rækker, du ikke har brug for. Begræns resultater, og vælg kun det, du viser.
  • Forkert connection pool-konfiguration — en pool, der er for lille, sætter forespørgsler i kø; en for stor kan overvælde databasen. Tilpas den til reel trafik.

Vid det, før dine brugere gør

Værktøjer på query-niveau fortæller dig, hvad der er langsomt inde i databasen. De fortæller dig ikke, om din database er tilgængelig fra din applikation, eller om en health-check-query stadig svarer, mens du sover. Det er her, ekstern monitoring kommer ind.

isthisthing.online lader dig oprette en MySQL- eller PostgreSQL-Monitor, der forbinder til din database efter en tidsplan, kører et check og måler Response Time. Hvis databasen holder op med at svare, eller et check overskrider sin Timeout, får du en alert via Email, Slack eller dine andre kanaler — før dine brugere nogensinde ser en fejl. Kombineret med en Incident-tidslinje og en offentlig Status Page forvandler du "siden blev langsom" til en besked, du sender, i stedet for en, du modtager.

En praktisk checkliste

  • Aktivér slow query-logning (PostgreSQL: pg_stat_statements; MySQL: slow_query_log).
  • Find dine 10 langsomste queries, og kør EXPLAIN ANALYZE på hver.
  • Ret manglende indexes og N+1-problemet først — de giver de største gevinster.
  • Sæt en latency-tærskel, og alarmér på den, ikke kun på fejl.
  • Tilføj en MySQL- eller PostgreSQL-Monitor i isthisthing.online for at overvåge tilgængelighed og Response Time udefra.
  • Gennemgå query-metrics efter hver deployment og hver skemaændring.

Langsomme queries annoncerer ikke sig selv. De hober sig op, indtil siden føles langsom, databasen mættes, og du bekæmper et nedbrud, du kunne have forhindret. Overvåg din database indefra og udefra, og lad isthisthing.online fortælle dig det først.

Opret din første Monitor i dag. Åbn din gratis konto og fang langsomme queries, før dine brugere gør.