|
|
My SQLLEZIONI - L'OTTIMIZZAZIONE L'ottimizzazione nell'uso di un database è un argomento estremamente complesso, in quanto è condizionato da una notevole quantità di variabili. Esistono concetti che sono applicabili in generale alle basi di dati relazionali, e altri che sono specificamente relativi ad un certo RDBMS, in dipendenza delle sue caratteristiche. Naturalmente finchè le nostre applicazioni sono di dimensioni limitate, sia come quantità di dati, sia come numero di utenti che accedono al database, difficilmente noteremo problematiche di questo genere. Se invece ci troviamo a gestire applicazioni che devono supportare numerosi accessi simultanei (ad esempio siti web che riscuotono un notevole successo) oppure basi di dati che assumono una notevole consistenza (nell'ordine almeno delle centinaia di migliaia di righe, il che può succedere anche per applicazioni con pochi utenti) potrà capitarci di avere un degrado più o meno forte nelle prestazioni, che di solito può essere risolto (o perlomeno limitato) ottimizzando alcuni aspetti dell'applicazione o della base dati, o in alcuni casi della configurazione del server. In questa lezione faremo alcuni accenni all'ottimizzazione di MySQL, alla quale è dedicato un intero capitolo del manuale. Il primo livello di ottimizzazione al quale possiamo guardare è quello relativo al server e alla sua configurazione. Come abbiamo già visto nella lezione 4, sono molto numerose le variabili che influiscono sul funzionamento di MySQL. L'amministratore del server ha la possibilità di impostarne i valori attraverso i file di configurazione, oppure con opzioni al momento dell'avvio, o ancora modificandole a server attivo. L'istruzione SQL SHOW VARIABLES ci consente di visualizzare i valori di tutte le variabili in uso sul server (sebbene non tutte abbiano un'influenza diretta sulle prestazioni). Ovviamente sarebbe molto lungo spiegare il significato di tutte le variabili; inoltre è necessario tempo anche per abituarsi a valutare l'impatto di ciascuna di esse sul funzionamento del server. Ci limiteremo quindi a dire che le prime da prendere in considerazione per quanto riguarda l'ottimizzazione sono key_buffer_size e table_cache: la prima rappresenta la quantità di spazio di memoria che viene utilizzata da MySQL per tenere in memoria i valori degli indici delle tabelle MyISAM, in modo da limitare gli accessi al disco (può essere impostato intorno al 25% del totale della memoria per una macchina su cui MySQL è l'applicazione principale); la seconda invece indica il numero di tabelle che il server può mantenere aperte contemporaneamente. Raggiunto questo numero, MySQL dovrà chiudere una tabella ogni volta che ha la necessità di aprirne un'altra. Un accorgimento che può consentire di risparmiare tempo su tutte le istruzioni inviate al server è quello di utilizzare un sistema semplice di permessi: in sostanza, evitare completamente di attribuire permessi a livello di tabella o di colonna, e limitarsi a dare permessi sui database. Infatti, se le tabelle tables_priv e columns_priv del database mysql (vedere lez.6) non contengono dati, MySQL non dovrà andare ogni volta a verificare i permessi su di esse. Il secondo livello di ottimizzazione riguarda la struttura delle basi di dati, cioè il modo in cui vengono progettate le tabelle. Vediamo qualche suggerimento:
Un terzo livello di ottimizzazione, non meno importante degli altri, è quello che riguarda l'accesso ai dati: una query infatti può essere più o meno veloce (a volte con differenze anche notevoli), in base alla strategia scelta da MySQL per eseguirla. Anche l'ottimizzazione delle query è un argomento piuttosto complesso. Se notate che alcune query sono piuttosto lente, un primo strumento utilizzabile per valutarle è la funzione BENCHMARK, usata dal client mysql: SELECT BENCHMARK(100000,'query'); Questa istruzione ci permette di eseguire una query un numero arbitrario di volte: indicheremo tale numero come primo parametro e la query che vogliamo vedere come secondo parametro. Come risultato dell'istruzione non otterremo niente, ma il client MySQL ci mostra dopo ogni istruzione il tempo che ha impiegato ad eseguirla: in questo modo potremo valutare l'impatto di eventuali modifiche sulla struttura della query. In genere è necessario usare numeri piuttosto grandi (almeno 100.000, ma spesso anche maggiori) per avere tempi valutabili nell'ordine dei centesimi di secondo; ovviamente questo dipende dalla complessità della query e dalla velocità del processore che utilizziamo. Il secondo passo da fare per valutare l'efficienza di una query è l'utilizzo della EXPLAIN, che ci permette di visualizzare i criteri utilizzati da MySQL per la sua esecuzione: EXPLAIN [EXTENDED] SELECT ... A questa pagina del manuale potete trovare una dettagliata spiegazione di come interpretare l'output di questa istruzione. Un modo di "suggerire" a MySQL di utilizzare un indice è quello di aggiungere la clausola FORCE INDEX nome_indice di seguito al nome della tabella nella SELECT. Accorgimenti si possono utilizzare anche per velocizzare le operazioni di inserimento dei dati, in particolare quando dobbiamo inserire più righe alla volta. Ad esempio:
Oltre a questi accorgimenti, dobbiamo tenere presente che quando effettuiamo numerosi aggiornamenti o cancellazioni su una tabella, lo spazio su disco occupato da questa tabella può diventare male organizzato (in particolare per le tabelle con righe a lunghezza variabile): è bene quindi eseguire periodicamente un'ottimizzazione della tabella attraverso l'istruzione OPTIMIZE TABLE nome_tabella. Con questo abbiamo concluso questa rapida carrellata sull'ottimizzazione: come abbiamo detto all'inizio, però, l'argomento è ben più complesso, per cui vi invitiamo ad approfondirlo sul manuale di MySQL. |