Come ottimizzare le prestazioni di MySQL
Guida completa all'ottimizzazione delle prestazioni del database MySQL: ottimizzazione della configurazione, ottimizzazione delle query, indicizzazione e monitoraggio.

L'ottimizzazione delle prestazioni MySQL è cruciale per le applicazioni che gestiscono grandi quantità di dati o traffico elevato. Questa guida copre le tecniche essenziali per migliorare le prestazioni MySQL, dall'ottimizzazione della configurazione all'ottimizzazione delle query.
Ottimizzazione della configurazione MySQL
Modifica il file di configurazione MySQL per ottimizzare le prestazioni in base alle risorse del tuo server:
# Modifica la configurazione MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Modifica la configurazione MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf
# Aggiungi o modifica queste impostazioni:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M
# Riavvia MySQL
sudo systemctl restart mysql # Ubuntu/Debian
sudo systemctl restart mysqld # CentOS/RHELOttimizzazione InnoDB
InnoDB è il motore di storage predefinito di MySQL. Ottimizzalo per prestazioni migliori:
# In /etc/mysql/mysql.conf.d/mysqld.cnf o /etc/my.cnf
[mysqld]
# Pool di buffer InnoDB (usa il 70-80% della RAM disponibile)
innodb_buffer_pool_size = 2G
# Dimensione del file di log InnoDB
innodb_log_file_size = 512M
# Metodo di flush InnoDB (per SSD)
innodb_flush_method = O_DIRECT
# Thread I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# Flush del log InnoDB al commit della transazione
innodb_flush_log_at_trx_commit = 2Configurazione della cache delle query
La cache delle query può migliorare le prestazioni per carichi di lavoro con molte letture (Nota: La cache delle query è deprecata in MySQL 8.0):
# Per MySQL 5.7 e versioni precedenti
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# Controlla lo stato della cache delle query
mysql> SHOW VARIABLES LIKE 'query_cache%';
# Controlla le statistiche della cache delle query
mysql> SHOW STATUS LIKE 'Qcache%';Ottimizzazione degli indici
Un'indicizzazione corretta è cruciale per le prestazioni delle query:
# Analizza la tabella per aggiornare le statistiche degli indici
ANALYZE TABLE table_name;
# Controlla gli indici non utilizzati
SELECT * FROM sys.schema_unused_indexes;
# Crea un indice
CREATE INDEX idx_column ON table_name(column_name);
# Crea un indice composito
CREATE INDEX idx_multi ON table_name(col1, col2, col3);
# Mostra gli indici
SHOW INDEXES FROM table_name;
# Elimina un indice non utilizzato
DROP INDEX idx_name ON table_name;Ottimizzazione delle query
Ottimizza le tue query SQL per prestazioni migliori:
- Usa EXPLAIN per analizzare i piani di esecuzione delle query: EXPLAIN SELECT * FROM table WHERE column = 'value'
- Evita SELECT * - seleziona solo le colonne necessarie
- Usa LIMIT per limitare i set di risultati
- Usa clausole WHERE appropriate con colonne indicizzate
- Evita funzioni nelle clausole WHERE (es., WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
- Usa JOIN invece di sottoquery quando possibile
- Usa UNION invece di OR per condizioni multiple quando appropriato
Monitoraggio delle prestazioni MySQL
# Controlla lo stato MySQL
mysql> SHOW STATUS;
# Controlla le query lente
mysql> SHOW VARIABLES LIKE 'slow_query%';
# Abilita il log delle query lente
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# Controlla l'elenco dei processi
mysql> SHOW PROCESSLIST;
# Controlla lo stato della tabella
mysql> SHOW TABLE STATUS LIKE 'table_name';
# Controlla lo stato InnoDB
mysql> SHOW ENGINE INNODB STATUS;Consigli per l'ottimizzazione delle prestazioni
- Esegui regolarmente OPTIMIZE TABLE per deframmentare le tabelle
- Monitora il log delle query lente e ottimizza le query lente
- Usa il connection pooling per ridurre il sovraccarico delle connessioni
- Partiziona tabelle grandi per data o intervallo per prestazioni migliori
- Usa repliche di lettura per carichi di lavoro con molte letture
- Mantieni MySQL aggiornato all'ultima versione stabile
- Monitora l'I/O del disco e considera l'uso di storage SSD/NVMe
- Usa EXPLAIN ANALYZE (MySQL 8.0+) per un'analisi dettagliata delle query