0Pricing
PHP Academy · Lezione

Ottimizzazione delle query al database

Individuare le query N+1, aggiungere indici e ridurre il numero di query.

Ottimizzazione delle query al database è una lezione PHP Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento PHP Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso PHP Academy include 4 lezioni in totale.

Individuazione delle query lente

Abiliti il log delle query lente di MySQL e imposti una soglia. Esamini le query che richiedono più tempo del previsto.

# 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

Utilizzi EXPLAIN per capire come MySQL esegue una query e se vengono utilizzati gli indici.

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

Aggiunta di indici

Gli indici velocizzano notevolmente le letture sulle colonne utilizzate nei filtri e negli ordinamenti.

-- 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"]);

Problema delle query N+1

Il problema N+1 esegue una query per ottenere un elenco e una query aggiuntiva per ogni elemento di una relazione. Lo risolva utilizzando il caricamento eager.

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

Selezione delle sole colonne necessarie

Eviti SELECT *: recuperi solo le colonne necessarie per ridurre l'utilizzo della memoria e il trasferimento sulla rete.

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

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

Elaborazione a blocchi di grandi dataset

Elabori i set di risultati di grandi dimensioni in blocchi per evitare l'esaurimento della memoria.

<?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 delle query

Memorizzi nella cache le aggregazioni e i report costosi che non cambiano frequentemente.

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

Eviti le query nei cicli

Non esegua mai query all'interno di cicli foreach. Raccolga prima gli ID, quindi li recuperi con un'unica query.

<?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 delle connessioni al database

PHP-FPM crea una nuova connessione PDO per ogni worker. PgBouncer o ProxySQL possono effettuare il pooling delle connessioni per evitare di sovraccaricare il database con il costo delle connessioni.

Indici covering

Un indice covering include tutte le colonne necessarie per soddisfare una query: MySQL può rispondere alla query utilizzando soltanto l'indice, senza accedere alle righe della tabella principale.

Riepilogo

Abiliti i log delle query lente. Utilizzi EXPLAIN per individuare gli indici mancanti. Carichi in anticipo le relazioni. Selezioni solo le colonne necessarie. Elabori i dataset di grandi dimensioni in blocchi. Memorizzi nella cache le aggregazioni costose. Eviti le query nei cicli.

Verifica rapida

Che cos'è il problema delle query N+1?

Domande Frequenti

La lezione «Ottimizzazione delle query al database» è gratuita?

Sì — il testo completo di «Ottimizzazione delle query al database» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso PHP Academy, passa a CoddyKit PRO. Il corso PHP Academy include 4 lezioni in totale.

Cosa imparerò in «Ottimizzazione delle query al database»?

Individuare le query N+1, aggiungere indici e ridurre il numero di query. Eserciti PHP Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare PHP Academy?

Non è richiesta alcuna esperienza precedente. PHP Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Ottimizzazione delle query al database»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione PHP Academy?

Sì. Ogni lezione PHP Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Profilazione di PHP con Xdebug
  2. OPcache: caching del bytecode
  3. Ottimizzazione delle query al database
  4. Gestione della memoria e consigli sulle prestazioni
← Torna a PHP Academy