Database / MySQLMarzo 20266 min di lettura

Indici MySQL spiegati in modo pratico: come individuo e risolvo i colli di bottiglia

Quando le tabelle crescono da qualche centinaio di record a centinaia di migliaia, query che prima sembravano istantanee iniziano a rallentare l'intera applicazione. Nella maggior parte dei casi non serve cambiare database: basta capire dove e come applicare gli indici corretti.

#MySQL#Database#SQL#Backend#Ottimizzazione

01. A cosa serve davvero un indice

Una tabella senza indici funziona come un libro senza indice analitico: per trovare gli ordini con `status = 'completed'`, MySQL deve scorrere ogni singola riga (full table scan). L'indice crea una struttura ordinata che consente al motore del database di saltare direttamente alle righe corrispondenti.

Tuttavia, aggiungere indici a caso danneggia la velocità di scrittura: ogni volta che si inserisce o aggiorna un record, MySQL deve aggiornare anche gli indici collegati. Serve equilibrio.

  • Indicizzare i campi usati frequentemente in `WHERE`, `ORDER BY` e `JOIN`
  • Evitare di indicizzare da soli campi con pochi valori distinti (es. booleani)
  • Le foreign key dovrebbero quasi sempre avere un indice dedicato
  • Fare attenzione al numero di indici su tabelle soggette a molte scritture

02. Indici composti e ordine delle colonne

Un errore frequente è creare due indici singoli per campi che vengono sempre cercati insieme, come `user_id` e `created_at`. Un indice composto su `(user_id, created_at)` è molto più efficiente.

L'ordine delle colonne nell'indice conta molto: prima vanno i campi usati con uguaglianza (`user_id = 5`) e poi quelli usati per intervalli o ordinamento (`created_at DESC`).

03. Usare EXPLAIN prima di intervenire

Prima di creare un indice, eseguo sempre `EXPLAIN` sulla query SQL. Controllo le colonne `type` e `rows`: se il tipo è `ALL`, MySQL sta scansionando l'intera tabella. Dopo la migration con il nuovo indice, ricontrollo `EXPLAIN` per verificare che la query legga solo la frazione di righe necessaria.

Capire il funzionamento degli indici toglie ogni mistero all'ottimizzazione del database. Dedicare venti minuti all'analisi dei log delle query lente e all'aggiunta di indici corretti migliora drasticamente le prestazioni senza costi extra.