L’utilizzo di MySQL permette ai siti web di acquisire, sfruttare e valorizzare una propria componente dinamica, abilitando a funzionare i vari CMS (Joomla!, WordPress, Drupal, PrestaShop) ad essere in questo modo personalizzabili, programmabili ed editabili mediante appositi backend.
Così facendo, si forniscono ai visitatori informazioni variabili nel tempo e sempre aggiornate, con la possibilità di modificare i dati mediante apposite credenziali ed interfacce web.
I siti di news, così come i blog, gli aggregatori di notizie e molti altri tipi di portali web, fanno ampio uso di database MySQL, a maggior ragione del fatto che parliamo di un sistema free ed open source e, per queste due ragioni, ampiamente documentato ed utilizzato.
È possibile quindi valutare le prestazioni di un server MySQL, al fine di rendersi conto se esistono margini di ottimizzazione?
In linea di massima le prestazioni di un web server si valutano mediante apposite procedure di benchmark e stress test (ad esempio LoadImpact), che possiedono il vantaggio di non dover neanche essere installate. Al tempo stesso, comunque, è bene tenere presente che l’unico modo efficace per migliorare i tempi di accesso al sito passa per un’ottimizzazione del codice usato (in certi casi intervendo anche sul core) e della struttura del database.
Per agire in prima istanza in questa direzione, possiamo pensare di ottimizzare le singole tabelle, ad esempio (mediante linea di comando MySQL oppure, se preferite, mediante PHPMyAdmin):
OPTIMIZE TABLE nometabella
Sui database con supporto InnoDB inoltre, questo comando in particolare (che richiede permessi di grant per insert e select per funzionare correttamente) permette di ricostruire la tabella in questione riallocandola e liberando lo spazio inutilizzato dall’indice.
Più spesso è conveniente ottimizzare il database per intero e per farlo si può usare (solo da linea di comando) questa variante:
mysqlcheck -o –all-databases
Valutare la velocità di trasferimento dati del database è un’operazione ulteriore che possiamo abilitare mediante degli appositi plugin per i CMS, oppure lavorando direttamente sul codice del theme del sito in questione.
Lato MySQL, è possibile eseguire questa query da PHPMyAdmin e poi andare ad eseguire una query benchmark di questo tipo (fonte MySQL.com):
SELECT BENCHMARK(1000000,ENCODE(‘hello’,’goodbye’));
Tale query forza il server del database ad eseguire un certo numero di operazioni di “routine” e con questo semplice comando fornirà una risposta in un tempo variabile, ad esempio 4.45 secondi, che verrà indicato relativamente al client: questo è molto importante perché permette di fare delle valutazioni, ripetendo il test più volte, sul tempo medio di “carico” della macchina su cui alloggia il vostro sito.
Per WordPress, ad esempio, le prestazioni possono essere monitorate installando uno dei plugin come il famoso Benchmark, il più avanzato QueryMonitor (che possiede maggiore attenzione ad aspetti aggiuntivi di WordPress, ad esempio richieste http, hooks, espressioni condizionali, query generiche, redirect) ed anche l’interessante e facile da integrare CPU Performance (che come nel caso precedente valuta anche l’eventuale sovrautilizzo di RAM e di CPU del server che ospita il servizio di hosting).
Di solito, infine, è possibile inserire dei contatori che vadano a valutare il numero/tipo di query e, soprattutto, il tempo necessario per eseguirle: salvo configurazioni del server scorrette o problemi di connettività, in effetti, il vero “collo di bottiglia” per le prestazioni di un sito passa in larga parte per i tempi di accesso di MySQL (questo, in prima istanza, vale per un buon numero di casi reali, anche se non per tutti).
Per valutare i tempi, solitamente si procede utilizzando il seguente codice PHP:
- si memorizza in una variabile $a, nel codice PHP ed in corrispondenza dell’istruzione prima del lancio della query SQL, il timestamp “di partenza”, ad esempio $a = time();
- in corrispondenza della fine della query, o nel punto che ci interessa, si va a ricalcolare in una nuova variabile $b = time(); il timestamp “di arrivo”;
- si calcola la differenza tra $b ed $a, valore espresso in millisecondi, ottenendo un valore maggiore di zero che andrà convertito eventualmente in secondi, cioè divivendo il numero trovato per mille.
Questo valore è una stima realistica del tempo necessario all’esecuzione della query e misurandolo ripetutamente effettuando, poco alla volta, delle modifiche sulla struttura della query riducendo ad esempio il numero di colonne necessarie, sarà possibile provare a ridurre la durata ed i tempi di attesa per il client.
Lascia un commento