I database svolgono un ruolo fondamentale nelle prestazioni di qualsiasi applicazione. Il database MySQL non fa eccezione. È quindi importante comprendere i molti modi in cui l'ottimizzazione, la progettazione e la configurazione del database possono aiutare a migliorare le prestazioni della tua applicazione. Di seguito sono riportati alcuni modi in cui MySQL può essere ottimizzato per raggiungere prestazioni ottimali.
Ottimizzare le query
L'ottimizzazione delle prestazioni del database ha inizio dall'applicazione. Il modo in cui l'applicazione traduce i requisiti aziendali in query del database fa una grande differenza in termini di complessità ed efficienza dell'applicazione stessa. La vera misura delle prestazioni è l'efficienza con cui ogni istanza di database contribuisce alle esigenze aziendali.
Progettare lo schema
Il modo in cui le entità e le relazioni sono definite in un database relazionale determina quanto sarà semplice o complessa la risposta a una query di database. Anche il modo in cui vengono definiti la chiave primaria e gli indici secondari svolge un ruolo importante.
Configurare il server
La configurazione del server è responsabile dell'ottimizzazione e della massimizzazione dell'utilizzo delle risorse di sistema. Le risorse di sistema sono le CPU (Core Processing Unit), la memoria della macchina fisica o virtuale (VM), il sistema di archiviazione sottostante e la rete.
Regolare il server in modo dinamico
Continuo monitoraggio, perfezionamento e ottimizzazione delle prestazioni per adattare i carichi di lavoro del database alle dinamiche reali.
Questo articolo riguarda l'ottimizzazione delle query. Gli altri argomenti verranno trattati negli articoli successivi.
Spesso iniziamo il processo di ottimizzazione delle query esaminando la query nel database. Un modo migliore è iniziare con una valutazione dell'efficienza con cui il requisito aziendale è stato convertito in una query di database. L'interpretazione e l'elaborazione di una esigenza aziendale in una query determina la portata dei costi.
Il primo passaggio consiste nell'assegnare una priorità alle query da ottimizzare:
Queste due categorie devono essere ottimizzate durante la progettazione dello schema del database.
Una transazione è un'unità logica in cui tutte le istruzioni contenute devono eseguire il commit completo o il rollback. La transazione è la funzionalità che fornisce atomicità, coerenza, isolamento e durabilità (ACID) per MySQL.
In InnoDB, il motore di archiviazione per MySQL, tutte le attività degli utenti avvengono all'interno di una transazione. Per impostazione predefinita, è abilitata la modalità di commit automatico, il che significa che ogni istruzione SQL forma una singola transazione a sé stante. Per eseguire una transazione con più istruzioni quando è abilitato il parametro autocommit, avvia la transazione in modo esplicito con START_TRANSACTION o START_TRANSACTION e terminala con START_TRANSACTION o START_TRANSACTION. Se la modalità autocommit è disabilitata, la sessione ha sempre una transazione aperta fino a quando non viene completato un COMMIT o un COMMIT e ne inizia uno nuovo.
La best practice relativa alle transazioni consiste nel mantenerle il più brevi possibile. Ciò è dovuto al fatto che le transazioni lunghe presentano diversi svantaggi, come descritto più avanti in questo articolo.
1. Contese di blocco prolungate, che causano query più lente e potenziali errori delle query
2. Prestazioni ridotte del server a causa di un numero elevato di log di annullamento
3. Maggiore utilizzo del disco
4. Tempo di arresto prolungato
5. Tempo di ripristino prolungato in caso di arresto anomalo
Le query possono essere acquisite sul lato applicazione o sul lato database.
È buona prassi di sviluppo registrare le query di database e il tempo di esecuzione delle query. Il logging laterale delle applicazioni consente di valutare facilmente l'efficacia e l'efficienza delle query nel contesto aziendale. Ad esempio, gli utenti possono registrare il tempo di risposta di ogni query o il tempo di risposta dei log per determinate funzionalità. Questo è anche un modo semplice per ottenere un tempo di esecuzione totale per le transazioni con più istruzioni.
Inoltre, il tempo di risposta alle query misurato dal logging lato applicazione è una misurazione end-to-end, che include il tempo di rete. Integra il tempo di esecuzione delle query registrato dal database e semplifica l'identificazione della presenza di problemi relativi alla rete o al database.
Query Insights di MySQL di Cloud SQL
Lo strumento Query Insights di Cloud SQL consente l'acquisizione, il monitoraggio e la diagnosi delle query.
Query Insights consente di trovare facilmente le query principali in base al tempo e alla frequenza di esecuzione.
Lo strumento offre opzioni di filtro come intervallo di tempo, database, account utente e indirizzo client. Include grafici per mostrare l'utilizzo della CPU e la suddivisione su attese IO e di blocco. La tabella "Query e tag principali" elenca le query principali per tempo di esecuzione con le query che vengono normalizzate. Oltre al tempo di esecuzione, include statistiche su "righe medie scansionate" e "righe medie restituite" che forniscono insight sull'efficienza delle query.
Consulta la documentazione per vedere tutto ciò che offre lo strumento e come attivarlo.
Utilizzare performance_schema
Su Cloud SQL per MySQL, la funzionalità performance_schema è abilitata per impostazione predefinita per MySQL 8.0.26 e versioni successive con oltre 15 GB di memoria. L'abilitazione o la disabilitazione della funzionalità richiede il riavvio dell'istanza.
Quando performance_schema=ON, gli strumenti di istruzione query sono abilitati per impostazione predefinita. La tabella sys.statement_analysis fornisce statistiche aggregate per le query normalizzate. Risponde a domande come:
Se utilizzi MySQL Workbench, è dotato di report sugli schemi delle prestazioni basati sulla visualizzazione del sistema. Il report include una sezione relativa alle istruzioni SQL ad alto costo, che fornisce insight sulle prestazioni delle query.
Utilizza lo slow log + strumenti
Lo slow log acquisisce tutte le query in esecuzione più a lungo di long_query_time. Registra inoltre i tempi di esecuzione delle query, il tempo di blocco, le righe di dati esaminate e le righe di dati inviate. Le statistiche aggiuntive sull'esecuzione lo rendono un candidato preferito per l'analisi delle query del database rispetto all'utilizzo del log generale.
È consigliabile attivare gli slow log. Generalmente, il valore long_query_time deve essere mantenuto a una soglia ragionevole per acquisire le query che intendi esaminare e ottimizzare.
log_output=FILE
slow_query_log=ON
long_query_time=2
Di tanto in tanto, è opportuno impostare long_query_time=0 in modo da acquisire tutte le query per un breve periodo e ottenere una panoramica del volume e delle prestazioni delle query.
Esistono strumenti, come mysqldumpslow e pt-query-digest, che estraggono le firme delle query e generano un report per mostrare le statistiche sulle query.
Esistono altri strumenti di monitoraggio di terze parti che generano report sulle statistiche delle query, ad esempio Monitoraggio e gestione Percona, Monitoraggio delle prestazioni del database di SolarWinds (in precedenza VividCortex) e altri ancora.
Dopo aver acquisito le query nelle transazioni, il passaggio successivo è ottimizzarle.
Il comando EXPLAIN fornisce il piano di esecuzione della query e, a partire dalla versione 8.0.18, il comando EXPLAIN ANALYZE esegue un'istruzione e produce un output EXPLAIN insieme ai tempi dell'esecuzione.
Query Insight di MySQL fornisce un accesso utile al piano EXPLAIN.
Che cosa cerchiamo nell'output?
Le variabili di stato della sessione possono essere utilizzate per ottenere i dettagli sull'esecuzione della query.
Innanzitutto, cancella le variabili di sessione, quindi esegui la query ed esamina i contatori. Ad esempio, lo stato Handler_* mostra il pattern di accesso ai dati e la quantità di righe. Created_* viene visualizzato se viene creata una tabella temporanea e/o una tabella temporanea sul disco. Sort_* mostra il numero di pass di unione per l'ordinamento e il numero di righe ordinate. Ulteriori variabili di sessione sono illustrate nella documentazione.
L'istruzione SHOW PROFILE fornisce il tempo di esecuzione della query in base alla fase di esecuzione, un'informazione che potrebbe essere utile.
Una volta compreso il piano di esecuzione della query, esistono diversi modi per influenzarlo e ottimizzarlo.
Per ottimizzare la configurazione del server per alcune query, consigliamo vivamente di utilizzare le variabili a livello di sessione anziché modificare il valore globale che interessa tutte le sessioni.
I valori di sessione utilizzati di frequente sono:
In breve, per l'ottimizzazione delle query, abbiamo parlato di tre aspetti:
Inizia a creare su Google Cloud con 300 $ di crediti gratuiti e oltre 20 prodotti Always Free.