- 1 1. Introduzione
- 2 2. Che cos’è un indice MySQL?
- 3 3. Come controllare gli indici MySQL
- 4 4. Come verificare l’uso degli indici
- 5 5. Gestione degli indici
- 6 6. Ottimizzazione degli Indici (Miglioramento delle Prestazioni)
- 7 7. FAQ sugli Indici (Domande Frequenti)
- 7.1 La velocità di ricerca migliorerà aggiungendo più indici?
- 7.2 Quali colonne dovrebbero avere indici?
- 7.3 Gli indici vengono creati automaticamente?
- 7.4 Come scegliere tra indici B-Tree, Hash e FULLTEXT?
- 7.5 Come posso verificare la dimensione degli indici?
- 7.6 Come posso verificare se un indice viene utilizzato?
- 7.7 Quando dovrei rimuovere un indice?
- 8 8. Sommario
1. Introduzione
MySQL è un database relazionale ampiamente utilizzato in molte applicazioni web e sistemi di gestione dei dati. Per migliorare la velocità di recupero dei dati, esiste un meccanismo chiamato “indice”. Tuttavia, se non gestiti correttamente, gli indici possono effettivamente ridurre le prestazioni.
Perché è importante controllare gli indici?
Un indice in un database è simile alla sezione indice di un libro. Indici progettati correttamente migliorano la velocità di esecuzione delle query di ricerca. Tuttavia, possono verificarsi i seguenti problemi:
- Gli indici non sono creati correttamente → Possono causare ricerche lente
- Esistono indici non necessari → Rallentano gli aggiornamenti e le inserzioni
- Incertezza su quali indici vengano utilizzati → Rende difficile decidere se rimuovere gli indici inutilizzati
Cosa imparerai in questo articolo
- Il meccanismo di base degli indici MySQL
- Come controllare gli indici attuali (usando comandi SQL)
- Come gestire e ottimizzare gli indici
- Tecniche per analizzare l’utilizzo degli indici
Ora, impariamo sistematicamente gli indici MySQL e utilizziamo queste conoscenze per migliorare le prestazioni del database.
2. Che cos’è un indice MySQL?
Un indice è una funzionalità essenziale per migliorare le prestazioni del database. In questa sezione spieghiamo il concetto di base, i tipi, i vantaggi e gli svantaggi degli indici.
Concetto di base degli indici
Un indice di database è un meccanismo che consente di cercare rapidamente i valori in colonne specifiche. Per esempio, quando si cerca un record specifico in una tabella contenente una grande quantità di dati, senza un indice il database deve scansionare tutti i record (full table scan). L’applicazione di un indice rende il recupero dei dati efficiente e migliora significativamente la velocità di elaborazione.
Tipi di indici MySQL
MySQL supporta diversi tipi di indici, ciascuno adatto a casi d’uso specifici.
- PRIMARY KEY (Indice chiave primaria)
- Può essere impostato una sola volta per tabella
- Garantisce l’unicità della tabella
- Funziona come indice clusterizzato
- UNIQUE Index
- Assicura che i valori nella colonna specificata non siano duplicati
- I valori NULL sono consentiti (sono permessi più NULL)
- INDEX (Indice generico)
- Utilizzato per velocizzare le ricerche
- Sono consentiti dati duplicati
- FULLTEXT Index (per ricerca testuale)
- Ottimizza la ricerca di testo
- Utilizzato in combinazione con la sintassi
MATCH ... AGAINST
- SPATIAL Index (per dati geografici)
- Progettato per dati spaziali (GIS)
Vantaggi e svantaggi degli indici
Vantaggi
- Migliora la velocità di ricerca delle query
- Potenzia le prestazioni delle operazioni JOIN e delle clausole WHERE
- Rende più efficiente il recupero di dati specifici
Svantaggi
- Un numero elevato di indici rallenta le operazioni INSERT, UPDATE e DELETE
- Consuma spazio su disco
- Indici progettati in modo inadeguato possono degradare le prestazioni

3. Come controllare gli indici MySQL
Per gestire correttamente gli indici MySQL, è importante verificare quali indici sono attualmente definiti su una tabella. In questa sezione spieghiamo come controllare gli indici usando il comando SHOW INDEX, INFORMATION_SCHEMA.STATISTICS e il comando mysqlshow.
Comando SHOW INDEX (metodo di base)
In MySQL, è possibile utilizzare il comando SHOW INDEX per ottenere un elenco degli indici definiti su una tabella specifica. Questo comando consente di verificare dettagli come il nome dell’indice, le colonne coperte dall’indice e l’esistenza di un vincolo di unicità.
Sintassi di base
SHOW INDEX FROM table_name;
Esempio
Ad esempio, per controllare gli indici definiti sulla tabella users, esegui il seguente SQL:
SHOW INDEX FROM users;
Output di esempio
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Index_type |
|---|---|---|---|---|---|---|---|
| users | 0 | PRIMARY | 1 | id | A | 1000 | BTREE |
| users | 1 | idx_email | 1 | A | 500 | BTREE |
Utilizzo di INFORMATION_SCHEMA.STATISTICS (ottenere informazioni dettagliate)
Utilizzando la tabella di sistema di MySQL INFORMATION_SCHEMA.STATISTICS, è possibile recuperare le stesse informazioni di SHOW INDEX con maggiore flessibilità.
Controllare gli indici per una tabella specifica
SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'users';
Ottieni gli indici su tutto il database
SELECT TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name';
Comando mysqlshow (Controlla da CLI)
Puoi anche recuperare le informazioni sugli indici usando gli strumenti da riga di comando di MySQL. Questo è particolarmente utile quando si lavora via SSH su un server MySQL.
Come eseguire il comando
mysqlshow -u username -p password database_name table_name
Esempio
mysqlshow -u root -p my_database users
Cosa fare se non esistono indici
Se non vengono visualizzati indici dopo aver eseguito SHOW INDEX o interrogato INFORMATION_SCHEMA.STATISTICS, la tabella potrebbe non avere indici appropriati. In tal caso, è possibile migliorare le prestazioni di ricerca creando indici secondo necessità.
Crea un nuovo indice
CREATE INDEX idx_column ON users (email);
Imposta una chiave primaria (PRIMARY KEY)
ALTER TABLE users ADD PRIMARY KEY (id);
Elimina gli indici non necessari
ALTER TABLE users DROP INDEX idx_column;
4. Come verificare l’uso degli indici
Verificare se gli indici funzionano correttamente è un passaggio critico nell’ottimizzazione delle prestazioni di MySQL. In questa sezione, spieghiamo come determinare quali indici utilizza una query sfruttando il comando EXPLAIN e Performance Schema.
Analisi della query con EXPLAIN
Il comando EXPLAIN è usato per visualizzare come verrà eseguita una determinata query SQL. Ti aiuta ad analizzare gli indici utilizzati, i metodi di accesso e il piano di esecuzione, il che lo rende utile per verificare se gli indici funzionano come previsto.
Sintassi di base
EXPLAIN SELECT * FROM table_name WHERE condition;
Esempio
Ad esempio, per cercare nella tabella users usando la colonna email come condizione:
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
Output di esempio
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ref | idx_email | idx_email | 256 | const | 1 | Using index |
Punti chiave
- Se
type = ALL, la query esegue una scansione completa della tabella, quindi probabilmente è necessario un indice. - Se un nome di indice appare in
key, quell’indice viene utilizzato. - Se il valore di
rowsè troppo grande, potrebbe essere necessaria l’ottimizzazione della query.
Utilizzo di Performance Schema
Con il performance_schema di MySQL, puoi analizzare in dettaglio quali indici vengono utilizzati e con quale frequenza durante l’esecuzione della query.
Ottieni le statistiche di esecuzione della query
SELECT * FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT LIKE '%SELECT%';
Verifica l’uso degli indici per una tabella specifica
SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME, COUNT_STAR, SUM_TIMER_WAIT
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE OBJECT_SCHEMA = 'your_database_name' AND OBJECT_NAME = 'users';
Cosa fare se un indice non viene utilizzato
1. Revisiona la query
Se un indice non viene utilizzato, la struttura della query potrebbe essere il problema. Ad esempio, il seguente modello può impedire l’uso dell’indice.
❌ Esempio errato (La funzione disabilita l’uso dell’indice)
SELECT * FROM users WHERE LOWER(email) = 'test@example.com';
→ A causa di LOWER(email), l’indice su email potrebbe essere ignorato.
✅ Esempio corretto (Evita di usare una funzione)
SELECT * FROM users WHERE email = 'test@example.com';
2. Ricrea l’indice
Se un indice esistente non funziona correttamente, eliminarlo e ricrearlo può talvolta migliorare le prestazioni.
ALTER TABLE users DROP INDEX idx_email;
CREATE INDEX idx_email ON users(email);
3. Aggiorna le statistiche
Se le statistiche della tabella diventano obsolete, MySQL potrebbe non utilizzare gli indici in modo ottimale. Puoi aggiornare le statistiche con il seguente comando:
ANALYZE TABLE users;
5. Gestione degli indici
MySQL indexes are essential for improving data retrieval performance. However, if not properly managed, they can degrade overall database performance. In this section, we explain in detail how to create, delete, and identify unnecessary indexes.
Creazione di Indici
Creando indici appropriati, è possibile velocizzare significativamente le ricerche di dati. In MySQL, è possibile aggiungere indici usando CREATE INDEX o ALTER TABLE.
Sintassi di Base
CREATE INDEX index_name ON table_name(column_name);
Esempio
Per aggiungere un indice alla colonna email nella tabella users:
CREATE INDEX idx_email ON users(email);
Indice Multi-Colonna (Indice Composito)
CREATE INDEX idx_name_email ON users(last_name, first_name, email);
Indice Unico
CREATE UNIQUE INDEX idx_unique_email ON users(email);
Impostazione di una Chiave Primaria (PRIMARY KEY)
ALTER TABLE users ADD PRIMARY KEY (id);
Rimozione di Indici
Rimuovere gli indici non necessari aiuta a ridurre il carico del database.
Sintassi di Base
ALTER TABLE table_name DROP INDEX index_name;
Esempio
Ad esempio, per eliminare un indice chiamato idx_email:
ALTER TABLE users DROP INDEX idx_email;
Identificazione e Rimozione di Indici Non Necessari
Verifica di Indici Inutilizzati
SELECT * FROM sys.schema_unused_indexes;
Verifica dello Stato della Tabella (Impatto degli Indici)
SHOW TABLE STATUS LIKE 'users';
Rimuovi Indici Non Necessari
ALTER TABLE users DROP INDEX idx_unused;
Dopo l’eliminazione, è consigliato aggiornare le statistiche usando ANALYZE TABLE.
ANALYZE TABLE users;
6. Ottimizzazione degli Indici (Miglioramento delle Prestazioni)
Una corretta gestione degli indici può migliorare significativamente le prestazioni delle query MySQL. Tuttavia, creare semplicemente gli indici non è sufficiente — progettazione, gestione e monitoraggio adeguati sono necessari per mantenere prestazioni ottimali.
Progettazione Corretta degli Indici
Gli indici ben progettati possono migliorare drasticamente la velocità di ricerca in MySQL.
Casi in cui gli Indici Dovrebbero essere Applicati
| Recommended Use Case | Reason |
|---|---|
| Columns frequently used in WHERE clauses | Enables fast retrieval of specific data |
| Keys used in JOIN operations | Improves join performance |
| Columns used in ORDER BY / GROUP BY | Speeds up sorting and aggregation |
| Search columns in large datasets | Prevents full table scans |
Casi in cui gli Indici Non Dovrebbero essere Applicati
| Not Recommended Case | Reason |
|---|---|
| Small tables | Full table scans may be faster |
| Columns frequently updated or deleted | Increases index maintenance cost |
| Low cardinality columns (few distinct values) | Limited performance benefit (e.g., gender, boolean flags) |
Utilizzo del Log delle Query Lente
Il Log delle Query Lente consente di identificare le query a lunga esecuzione e analizzare quali indici non vengono applicati.
Abilita il Log delle Query Lente
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- Log queries taking longer than 2 seconds
Controlla il Log delle Query Lente
SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
Analizza una Query Lenta
EXPLAIN SELECT * FROM users WHERE last_login > '2024-01-01';
Esempio di Applicazione di un Indice
CREATE INDEX idx_last_login ON users(last_login);
Aggiornamento delle Statistiche (ANALYZE & OPTIMIZE)
ANALYZE TABLE (Aggiorna Statistiche)
ANALYZE TABLE users;
OPTIMIZE TABLE (Deframmentazione)
OPTIMIZE TABLE users;
7. FAQ sugli Indici (Domande Frequenti)
Gli indici MySQL sono un meccanismo essenziale per migliorare le prestazioni del database. Tuttavia, se non gestiti correttamente, possono avere l’effetto opposto. In questa sezione, riassumiamo le domande frequenti (FAQ) e le risposte relative agli indici MySQL.
La velocità di ricerca migliorerà aggiungendo più indici?
A. Non necessariamente.
Gli indici sono progettati per migliorare le prestazioni delle query, ma l’aggiunta di troppi indici può effettivamente degradare le prestazioni del database.
- Aumenta il carico di scrittura (INSERT, UPDATE, DELETE)
- L’uso di un indice dipende dalla query
- Gli indici non necessari consumano memoria
Quali colonne dovrebbero avere indici?
A. È efficace applicare indici ai seguenti tipi di colonne:
| Recommended Columns | Reason |
|---|---|
| Columns frequently searched in WHERE clauses | Faster data retrieval |
| Columns used in JOIN operations | Optimizes table joins |
| Columns used in ORDER BY / GROUP BY | Improves sorting and aggregation performance |
Gli indici vengono creati automaticamente?
A. Alcuni indici vengono creati automaticamente, ma altri devono essere aggiunti manualmente.
Indici Creati Automaticamente
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- PRIMARY KEY index
email VARCHAR(255) UNIQUE -- Index automatically created by UNIQUE constraint
);
Indici Creati Manualmente
CREATE INDEX idx_email ON users(email);
Come scegliere tra indici B-Tree, Hash e FULLTEXT?
| Index Type | Characteristics | Typical Use Case |
|---|---|---|
| B-Tree Index | Supports range searches | WHERE clauses, ORDER BY, JOIN |
| Hash Index | Exact match only (=) | High-speed lookups |
| FULLTEXT Index | Designed for text searching | Article search, full-text blog search |
Come posso verificare la dimensione degli indici?
SHOW TABLE STATUS LIKE 'users';
Come posso verificare se un indice viene utilizzato?
EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';
Quando dovrei rimuovere un indice?
| Indexes to Remove | Reason |
|---|---|
| Unused indexes | Wastes memory |
| Duplicate indexes | Redundant if similar indexes already exist |
Rimuovi un Indice Inutile
ALTER TABLE users DROP INDEX idx_unused;
8. Sommario
In questo articolo, abbiamo coperto in modo completo gli indici MySQL—dalle basi ai metodi di verifica, gestione, ottimizzazione e alle domande frequenti. Qui rivediamo i punti chiave di ogni sezione e riassumiamo le migliori pratiche per ottimizzare la gestione degli indici MySQL.
Punti Chiave
Che Cos’è un Indice MySQL?
- Un indice è un meccanismo che velocizza il recupero dei dati.
- Esistono diversi tipi, tra cui indici B-Tree, Hash e FULLTEXT.
- Più efficace quando applicato a colonne usate nelle clausole WHERE, JOIN e ORDER BY.
Come Verificare gli Indici MySQL
- Usa il comando
SHOW INDEXper visualizzare l’elenco degli indici. - Usa
INFORMATION_SCHEMA.STATISTICSper ottenere informazioni dettagliate.
Come Verificare l’Uso degli Indici
- Usa
EXPLAINper vedere quali indici utilizza una query. - Usa Performance Schema per analizzare la frequenza di utilizzo degli indici.
Gestione degli Indici
- Usa
CREATE INDEXper applicare gli indici alle colonne appropriate. - Usa
ALTER TABLE DROP INDEXper rimuovere gli indici non necessari. - Controlla la dimensione degli indici con
SHOW TABLE STATUSe ottimizza secondo necessità.
Ottimizzazione degli Indici (Miglioramento delle Prestazioni)
- Applica gli indici alle colonne WHERE, JOIN e ORDER BY usate frequentemente.
- Usa il Slow Query Log per identificare e ottimizzare le query lente.
- Aggiorna le statistiche con
ANALYZE TABLEeOPTIMIZE TABLE.
Best Practice per la Gestione degli Indici MySQL
- Identifica i colli di bottiglia delle query prima di applicare gli indici.
- Seleziona gli indici appropriati.
- Usa correttamente indici a colonna singola e indici compositi.
- Usa
UNIQUE INDEXdove sono richiesti vincoli di unicità.
- Rimuovi regolarmente gli indici non necessari.
- Identifica gli indici inutilizzati usando
SHOW INDEXeschema_unused_indexes.
- Aggiorna regolarmente le statistiche.
- Aggiorna le statistiche usando
ANALYZE TABLE. - Esegui
OPTIMIZE TABLEper risolvere la frammentazione causata da delete e update.
Prossimi Passi
✅ Checklist Pratica
✅ Hai controllato gli indici attuali usando SHOW INDEX?
✅ Hai abilitato il Slow Query Log e identificato le query lente?
✅ Hai analizzato il piano di esecuzione della query usando EXPLAIN?
✅ Hai rimosso gli indici non necessari e creato quelli appropriati?
✅ Hai aggiornato le statistiche usando ANALYZE TABLE?
Riepilogo Finale
- Una corretta gestione degli indici MySQL migliora significativamente le prestazioni di ricerca.
- Usa il Slow Query Log e EXPLAIN per analizzare l’efficacia degli indici e ottimizzare di conseguenza.
- Mantieni le prestazioni del database aggiornando regolarmente le statistiche e ottimizzando le tabelle.
Questa è la guida completa alla gestione degli indici MySQL.
Usa queste conoscenze per costruire sistemi di database più veloci ed efficienti. 💡🚀


