Aikido

Perché evitare gli indici ridondanti nei database: ottimizzazione dello spazio di archiviazione e delle prestazioni di scrittura

Prestazioni

Regola

Evitare database indici .
Indici indici indicizzazioni spreco
spazio e lento rallentamento scritture.

Lingue supportate: SQL

Introduzione

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.

Domande frequenti

Hai delle domande?

Come posso individuare gli indici ridondanti nel mio database?

Esegui una query sulle tabelle di sistema del tuo database per elencare tutti gli indici. Per PostgreSQL, utilizza la vista `pg_indexes`. Per MySQL, utilizza il comando `SHOW INDEX FROM nome_tabella`. Cerca gli indici in cui uno funge da prefisso di un altro (ad esempio, `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 composito?

Quando la selettività delle query è importante. Se si eseguono spesso query solo sulla seconda colonna di un indice composito, tale query non può utilizzare l'indice in modo efficiente. Un indice su (status, email) non sarà d'aiuto per le query che filtrano solo in base all'email. Tuttavia, un indice su (email, status) può supportare le query basate esclusivamente sull'email.

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

In misura minima per le operazioni di lettura, in misura significativa per quelle di scrittura. Il pianificatore delle query potrebbe scegliere tra indici ridondanti, ma il tempo di esecuzione è simile. Tuttavia, ogni operazione di scrittura (INSERT, UPDATE, DELETE) deve aggiornare tutti gli indici, moltiplicando le operazioni di I/O. Per le tabelle con un carico elevato di operazioni di scrittura, la rimozione degli indici ridondanti può migliorare la produttività del 20-50%.

Devo rimuovere tutti gli indici a colonna singola se ho degli indici composti?

Non sempre. Se l'indice a colonna singola è altamente selettivo e viene interrogato spesso da solo, è consigliabile mantenerlo. Utilizza le statistiche sulle query del database per verificare quali indici vengono effettivamente utilizzati. Elimina gli indici con un utilizzo pari a 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.