PHP Academy · Lektion

Optimering af databaseforespørgsler

Identificér N+1-forespørgsler, tilføj indekser, og reducér antallet af forespørgsler.

Lektion 3 af 412 trin

Optimering af databaseforespørgsler er en gratis PHP Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i PHP Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. PHP Academy-kurset indeholder 4 lektioner i alt.

Find langsomme forespørgsler

Aktiver MySQL-loggen over langsomme forespørgsler, og indstil en grænseværdi. Gennemgå forespørgsler, der tager længere tid end forventet.

# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5  # log queries over 500ms

EXPLAIN / EXPLAIN ANALYZE

Brug EXPLAIN til at forstå, hvordan MySQL udfører en forespørgsel, og om der bruges indekser.

-- 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)

Tilføjelse af indekser

Indekser gør læsninger af filtrerede og sorterede kolonner markant hurtigere.

-- 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-forespørgselsproblemet

N+1-problemet udfører én forespørgsel for at hente en liste plus én forespørgsel pr. element for en relation. Løs det med ivrig indlæsning.

<?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;

Vælg kun nødvendige kolonner

Undgå SELECT * — hent kun de kolonner, du har brug for, for at reducere hukommelsesforbruget og netværksoverførslen.

<?php
// Bad:
$users = User::all();

// Good:
$users = User::select("id", "name", "email")->get();

Opdeling af store datasæt i blokke

Behandl store resultatsæt i blokke for at undgå at løbe tør for hukommelse.

<?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));

Cachelagring af forespørgsler

Cachelagr dyre aggregeringer og rapporter, der ikke ændres ofte.

<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
    return Order::whereMonth("created_at", now()->month)->sum("total");
});

Undgå forespørgsler i løkker

Kør aldrig forespørgsler inde i foreach-løkker. Indsaml først id'er, og hent derefter alt med én forespørgsel.

<?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"]];
}

Puljehåndtering af databaseforbindelser

PHP-FPM opretter en ny PDO-forbindelse pr. arbejder. PgBouncer eller ProxySQL kan samle forbindelser i puljer, så databasen ikke overvældes af forbindelsesoverhead.

Dækkende indekser

Et dækkende indeks indeholder alle kolonner, der er nødvendige for at opfylde en forespørgsel — MySQL kan besvare forespørgslen direkte fra indekset uden at tilgå rækkerne i hovedtabellen.

Opsummering

Aktiver logning af langsomme forespørgsler. Brug EXPLAIN til at finde manglende indekser. Indlæs relationer ivrigt. Vælg kun nødvendige kolonner. Opdel store datasæt i blokke. Cachelagr dyre aggregeringer. Undgå forespørgsler inde i løkker.

Hurtigt tjek

Hvad er N+1-forespørgselsproblemet?

Gratis at komme i gang

Lær PHP med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
49
Lektioner
195

Ofte stillede spørgsmål

Er lektionen “Optimering af databaseforespørgsler” gratis?

Ja — hele teksten til “Optimering af databaseforespørgsler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af PHP Academy-kurset, skal du opgradere til CoddyKit PRO. PHP Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Optimering af databaseforespørgsler”?

Identificér N+1-forespørgsler, tilføj indekser, og reducér antallet af forespørgsler. Du øver dig i PHP Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på PHP Academy?

Der kræves ingen tidligere erfaring. PHP Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Optimering af databaseforespørgsler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne PHP Academy-lektion?

Ja. Alle PHP Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Profilering af PHP med Xdebug
  2. OPcache: Bytecode-caching
  3. Optimering af databaseforespørgsler
  4. Hukommelsesstyring og tips til ydeevne
← Tilbage til PHP Academy