EXPLAIN mostra il piano scelto dall'optimizer — come accederà a ciascuna tabella — senza eseguire la query. Lo leggi per confermare che gli indici vengano usati e che poche righe vengano esaminate.
EXPLAIN mostra il piano scelto dall'optimizer — come accederà a ciascuna tabella — senza eseguire la query. Lo leggi per confermare che gli indici vengano usati e che poche righe vengano esaminate.
const / eq_ref / ref (index lookup, buoni) → range → index (scansione completa dell'indice) → ALL (full table scan, il campanello d'allarme).NULL = nessuno).Using index (covering, ottimo), Using filesort / Using temporary (ordinamento/raggruppamento in memoria o su disco — spesso ottimizzabile).EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- +------+------+------+---------+--------+----------------+
-- | type | key | rows | Extra |
-- | ALL | NULL | 900k | Using where; Using filesort | <- scandisce tutto, ordina
-- +------+------+------+---------+--------+----------------+
-- Aggiungi un indice che copra il filtro E l'ordine di sort:
CREATE INDEX idx_cust_created ON orders (customer_id, created_at);
EXPLAIN SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at;
-- | type | key | rows | Extra |
-- | ref | idx_cust_created | 30 | Using where | <- fa seek di 30 righe, nessun filesort
L'indice ha trasformato una scansione ALL di 900k righe in un seek ref di 30 e, poiché created_at è la seconda colonna, le righe escono già ordinate — il filesort sparisce.
Usa EXPLAIN ANALYZE (MySQL 8) per vedere anche i tempi e i conteggi di righe effettivi, cogliendo i casi in cui la stima è sbagliata.
EXPLAIN è il modo per sostituire le supposizioni con l'evidenza. Individuare type: ALL, un rows enorme o Using filesort ti dice esattamente dove manca un indice — la via più rapida da "la pagina è lenta" a una correzione mirata.
Una raccolta di domande di colloquio IT con risposte dettagliate — da Junior a Senior.
Dona