Optimalisere databasespørringer
Finn N+1-spørringer, legg til indekser og reduser antallet spørringer.
Optimalisere databasespørringer er en gratis leksjon i PHP Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i PHP Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Identifisere trege spørringer
Aktiver MySQL-loggen for trege spørringer og angi en terskelverdi. Gå gjennom spørringer som tar lengre tid enn forventet.
# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 # log queries over 500msEXPLAIN / EXPLAIN ANALYZE
Bruk EXPLAIN for å forstå hvordan MySQL kjører en spørring, og om indekser brukes.
-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)Legge til indekser
Indekser gjør lesinger på filtrerte og sorterte kolonner betydelig raskere.
-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
// In Laravel migration:
$table->index(["user_id", "status"]);N+1-spørringsproblemet
N+1-problemet kjører én spørring for å hente en liste, pluss én spørring per element for en relasjon. Løs det med eager loading.
<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;
// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;Velge bare nødvendige kolonner
Unngå SELECT * — hent bare kolonnene du trenger for å redusere minnebruk og nettverksoverføring.
<?php
// Bad:
$users = User::all();
// Good:
$users = User::select("id", "name", "email")->get();Dele opp store datasett i blokker
Behandle store resultatsett i blokker for å unngå at minnet tømmes.
<?php
User::chunk(500, function ($users) {
foreach ($users as $user) {
// process each user
}
});
// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));Caching av spørringer
Bufre kostbare aggregater og rapporter som ikke endres ofte.
<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
return Order::whereMonth("created_at", now()->month)->sum("total");
});Unngå spørringer i løkker
Kjør aldri spørringer inne i foreach-løkker. Samle inn ID-er først, og hent deretter alt i én spørring.
<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");
foreach ($cartItems as $item) {
$product = $products[$item["product_id"]];
}Pooling av databasetilkoblinger
PHP-FPM oppretter en ny PDO-tilkobling per arbeider. PgBouncer eller ProxySQL kan samle tilkoblinger i en pool for å hindre at databasen overbelastes av tilkoblingskostnader.
Dekkende indekser
En dekkende indeks inneholder alle kolonnene som trengs for å oppfylle en spørring — MySQL kan svare på spørringen direkte fra indeksen uten å lese radene i hovedtabellen.
Sammendrag
Aktiver logger for trege spørringer. Bruk EXPLAIN for å finne manglende indekser. Bruk eager loading for relasjoner. Velg bare nødvendige kolonner. Del opp store datasett i blokker. Bufre kostbare aggregater. Unngå spørringer i løkker.
Rask sjekk
Hva er N+1-spørringsproblemet?
Lær deg PHP med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 49
- Leksjoner
- 195
Ofte stilte spørsmål
Er leksjonen «Optimalisere databasespørringer» gratis?
Ja – hele teksten i «Optimalisere databasespørringer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av PHP Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Optimalisere databasespørringer»?
Finn N+1-spørringer, legg til indekser og reduser antallet spørringer. Du øver på PHP Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med PHP Academy?
Ingen tidligere erfaring er nødvendig. PHP Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Optimalisere databasespørringer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne PHP Academy-leksjonen?
Ja. Alle PHP Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Profilere PHP med Xdebug
- OPcache: Bytekodebufring
- Optimalisere databasespørringer
- Minnehåndtering og ytelsestips