Regola
Evita indici di database ridondanti.
Gli indici di database sovrapposti
sprecano spazio di archiviazione e rallentano le scritture.
Linguaggi supportati: SQLIntroduzione
Gli indici ridondanti si verificano quando più indici coprono le stesse colonne o quando un indice è il prefisso di un altro. Ogni indice consuma spazio su disco e deve essere aggiornato durante le operazioni di INSERT, UPDATE e DELETE. Una tabella con cinque indici sovrapposti su colonne simili paga il prezzo in termini di prestazioni di scrittura cinque volte, mentre un solo indice sarebbe sufficiente per l'ottimizzazione delle letture.
Perché è importante
Impatto sulle prestazioni: Ogni indice rallenta le operazioni di scrittura perché il database deve aggiornare tutti gli indici quando i dati cambiano. Gli indici ridondanti moltiplicano questo costo senza offrire vantaggi per le query. Una tabella con tre indici ridondanti su user_id triplica il sovraccarico di scrittura, mentre viene utilizzato un solo indice.
Costi di archiviazione: Gli indici consumano spazio su disco proporzionalmente 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. Tabelle di grandi dimensioni con indici non necessari possono sprecare gigabyte di spazio.
Complessità di manutenzione: Più indici significano più oggetti da monitorare, analizzare e mantenere. Gli amministratori di database perdono tempo a ottimizzare indici che non offrono alcun valore. I pianificatori di query hanno più opzioni da valutare, scegliendo potenzialmente piani di esecuzione subottimali.
Esempi di codice
❌ Non conforme:
-- Indici ridondanti sulla tabella users
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created ON users(created_at);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Gli indici a colonna singola sono ridondanti perché
-- gli indici composti possono gestire le stesse query
Perché è errato: L'indice su email è ridondante perché idx_users_email_status inizia con email e può gestire query che filtrano solo per email. Allo stesso modo, idx_users_created è ridondante con idx_users_created_status. Ogni operazione di inserimento o aggiornamento su questa tabella aggiorna quattro indici laddove ne basterebbero due.
✅ Conforme:
-- Indici ottimizzati sulla tabella users
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created_status ON users(created_at, status);
-- Gli indici composti possono gestire query sulle colonne di prefisso
-- Le query basate solo su email usano idx_users_email_status
-- Le query basate solo su created_at usano idx_users_created_status
Perché questo è importante: Due indici composti soddisfano tutti i pattern di query eliminando la ridondanza. Le query che filtrano per email da solo utilizzano il primo indice, mentre quelle che filtrano per created_at da solo utilizzano il secondo. Le prestazioni di scrittura migliorano poiché è necessario aggiornare solo due indici anziché quattro.
Conclusione
Verifica regolarmente gli indici del database per individuare quelli ridondanti. Rimuovi gli indici che costituiscono il prefisso di altri indici o che duplicano la copertura. Gli indici composti possono soddisfare le query sulle loro colonne iniziali, eliminando nella maggior parte dei casi la necessità di indici separati su singola colonna.

