Regola
Evitare database indici .
Indici indici indicizzazioni spreco
spazio e lento rallentamento scritture.
Lingue supportate: SQLIntroduzione
Si parla di indici ridondanti quando più indici coprono le stesse colonne o quando un indice è un prefisso di un altro. Ogni indice occupa spazio su disco e deve essere aggiornato in occasione delle operazioni INSERT, UPDATE e DELETE. Una tabella con cinque indici sovrapposti su colonne simili subisce una penalizzazione delle prestazioni in scrittura pari a cinque volte, mentre un solo indice sarebbe sufficiente per l'ottimizzazione della lettura.
Perché è importante
Impatto sulle prestazioni: Ogni indice rallenta le operazioni di scrittura, poiché il database deve aggiornare tutti gli indici ogni volta che i dati cambiano. Gli indici ridondanti moltiplicano questo costo senza offrire alcun vantaggio in termini di prestazioni delle query. Una tabella con tre indici ridondanti su user_id triplica il sovraccarico di scrittura, mentre viene utilizzato sempre e solo un indice.
Costi di archiviazione: gli indici occupano spazio su disco in misura proporzionale alle dimensioni delle colonne indicizzate e al numero di righe. Gli indici ridondanti sprecano spazio di archiviazione che potrebbe essere utilizzato per i dati effettivi o per indici utili. Le tabelle di grandi dimensioni con indici superflui possono sprecare gigabyte di spazio di archiviazione.
Complessità della manutenzione: un numero maggiore di indici comporta un numero maggiore di oggetti da monitorare, analizzare e gestire. Gli amministratori di database dedicano tempo all’ottimizzazione di indici che non apportano alcun valore aggiunto. I pianificatori di query devono valutare un numero maggiore di opzioni, rischiando di scegliere piani di esecuzione non ottimali.
Esempi di codice
❌ Non conforme:
-- Indici ridondanti nella tabella degli utenti
CREATE INDEX idx_users_email ON users(email);
CREATE INDICE idx_users_email_status ON utenti(email, stato);
CREA INDICE idx_users_created ON utenti(data_creazione);
CREA INDICE idx_users_created_status SU users(created_at, status);
-- Gli indici a colonna singola sono ridondanti perché
-- gli indici composti possono gestire le stesse query
Perché è sbagliato: L'indice relativo alle e-mail è superfluo perché idx_users_email_status inizia con e-mail e può gestire query filtrate esclusivamente in base all'indirizzo e-mail. Allo stesso modo, idx_utenti_creati è ridondante rispetto a idx_utenti_creati_stato. Ogni operazione di inserimento o aggiornamento su questa tabella aggiorna quattro indici, quando ne basterebbero due.
✅ Conforme:
-- Indici ottimizzati sulla tabella degli utenti
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDICE idx_users_created_status ON users(created_at, status);
-- Gli indici composti possono essere utilizzati per le query sulle colonne prefisso
-- Le query che riguardano solo l'indirizzo e-mail utilizzano idx_users_email_status
-- Le query che utilizzano solo la colonna `created_at` utilizzano l'indice `idx_users_created_status`
Perché è importante: Due indici compositi coprono tutti i modelli di query, eliminando al contempo le ridondanze. Le query che filtrano in base a e-mail utilizzano esclusivamente il primo indice e le query che applicano un filtro in base a created_at utilizzare solo il secondo. Le prestazioni in scrittura migliorano perché sono solo due gli indici che devono essere aggiornati, anziché quattro.
Conclusione
Controlla regolarmente gli indici del database per individuare quelli ridondanti. Rimuovi gli indici che fungono da prefissi di altri indici o che duplicano la copertura. Gli indici compositi consentono di eseguire query sulle colonne iniziali, eliminando nella maggior parte dei casi la necessità di indici separati su singola colonna.

