Aikido

Perché evitare indici di database ridondanti: ottimizzazione dello spazio di archiviazione e delle performance di scrittura

Prestazioni

Regola

Evita indici di database ridondanti.
Gli indici di database sovrapposti
sprecano spazio di archiviazione e rallentano le scritture.

Linguaggi supportati: SQL

Introduzione

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.

FAQ

Hai domande?

Come faccio a identificare gli indici ridondanti nel mio database?

Interroga le tabelle di sistema del database per elencare tutti gli indici. Per PostgreSQL, usa la vista pg_indexes. Per MySQL, usa SHOW INDEX FROM nome_tabella. Cerca indici in cui uno è il prefisso di un altro (email rispetto a email+status) o in cui più indici coprono le stesse colonne in ordini diversi.

Quando un indice a colonna singola non è ridondante rispetto a un indice composto?

Quando la selettività della query è importante. Se esegui spesso query solo sulla seconda colonna di un indice composto, tale query non potrà utilizzare l'indice in modo efficiente. Un indice su (status, email) non aiuterà le query che filtrano solo per email. Tuttavia, un indice su (email, status) può servire query basate sulla sola email.

In che modo gli indici ridondanti influiscono sulle prestazioni delle query?

In modo minimo per le letture, in modo significativo per le scritture. Il pianificatore di query potrebbe scegliere tra indici ridondanti, ma il tempo di esecuzione è simile. Tuttavia, ogni scrittura (INSERT, UPDATE, DELETE) deve aggiornare tutti gli indici, moltiplicando le operazioni di I/O. Per le tabelle con molte scritture, la rimozione degli indici ridondanti può migliorare il throughput dal 20% al 50%.

Dovrei rimuovere tutti gli indici a colonna singola se dispongo di indici composti?

Non sempre. Se l'indice a colonna singola è altamente selettivo e viene interrogato frequentemente da solo, tienilo. Utilizza le statistiche delle query del database per verificare quali indici vengono effettivamente utilizzati. Elimina gli indici con utilizzo zero o molto basso. I database moderni tengono traccia dell'utilizzo degli indici nelle viste di sistema.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.