Claudio Cherubino's blog Life of a Googler

16Jul/0713

10 trucchi per migliorare le performance di MySQL

Da qualche mese sto studiando per ottenere la certificazione Certified MySQL 5.0 Developer e dopo aver passato il primo dei due esami, mi sto ovviamente concentrando su alcuni aspetti più avanzati, ad esempio l'ottimizzazione delle query e del sistema.

Un paio di giorni fa ho trovato un articolo molto interessante sull'argomento, scritto da Jay Pipes, il Community Relations Manager di MySQL AB, sul suo blog, e ho pensato di tradurlo in italiano e pubblicarlo qui, ovviamente con la benedizione di Jay.

Si tratta di 10 domande frequenti relative all'ottimizzazione delle query, e in generale di un server MySQL, penso che una lettura possa risultare interessante a qualunque sviluppatore e amministratore che abbia a che fare con questo database:

  1. Quale di queste due query è più veloce?

    SELECT ... WHERE some_col IN (1,2,3) or
    SELECT ... WHERE some_col = 1 OR some_col = 2 OR some_col = 3

    Nessuna. L'ottimizzatore riscrive l'operatore IN() come una serie di condizioni OR, pertanto non ci saranno differenze nelle performance. Si usa IN() per rendere il codice più conciso e leggibile.

  2. Dove vengono memorizzati in cache i record delle tabelle MyISAM?

    Da nessun parte. MyISAM non mette in cache i record delle tabelle come fa InnoDB con il suo innodb_buffer_pool. Invece MyISAM si appoggia sul sistema di buffering del sistema operativo sottostante per bufferizzare i record delle tabelle mentre vengono letti dal file .MYD. Il key_buffer MyISAM memorizza solo i blocchi indice, non i record con i dati.

  3. Quale di queste due query è più veloce?

    SELECT ... FROM t1, t2 WHERE t1.id = t2.id
    SELECT ... FROM t1 INNER JOIN t2 ON t1.id = t2.id

    Nessuna. L'ottimizzatore riscrive la seconda query nella prima forma. Lo stile SQL che adottate, ovviamente, dipende esclusivamente da voi, tuttavia vi consiglio di usare il secondo stile (noto come sintassi ANSI) invece del primo (noto come sintassi Theta) per un paio di ragioni:

    * MySQL supporta esclusivamente inner e cross join con la sintassi Theta. Tuttavia, MySQL supporta anche INNER, CROSS, LEFT e RIGHT join se si usa la sintassi ANSI. Mescolare i due stili può portare a del codice SQL poco leggibile.
    * E' molto facile scordare una condizione di join usando lo stile Theta, specialmente quando si collegano molte tabelle insieme. Dimenticarsi per sbaglio una condizione di join nella clausola WHERE porterà  ad un prodotto cartesiano (e non è buono!). La sintassi ANSI è più esplicita ed è più difficile dimenticarsi di una condizione di join.

  4. InnoDB è più veloce/migliore di MyISAM?

    Dipende. Non piace a nessuno questa risposta, ma è assolutamente vera. Ci sono vantaggi e svantaggi in ogni storage engine storage engine. MyISAM ha delle ottime performance in lettura e nel caso di grossi carichi, e richiede poche risorse. InnoDB, invece, è preferibile nel caso di grossi UPDATE, quando si ha necessità  di avere transazioni, integrità  referenziale e ricerche veloci su singola chiave. Si deve scegliere l'engine in base alle esigenze della propria applicazione e non secondo dei dettami generali del tipo "usate solo l'engine XXX".

  5. CHAR è più veloce di VARCHAR?

    No, non proprio. Se ci sono differenze di performance, sono trascurabili. Usate CHAR se sapete che i vostri dati saranno formati da un determinato numero di caratteri (come un numero di previdenza sociale, ad esempio), altrimenti VARCHAR.

  6. VARCHAR(80) è più veloce di VARCHAR(255)?

    Si, ma probabilmente non nel modo in cui pensate. Per quanto ne so io, non c'è differenza (almeno nelle versioni più recenti di MySQL e InnoDB) nei tempi necessari per recuperare colonne VARCHAR di differente lunghezza dal disco o dalla memoria. C'è invece una grande differenza in uno dei seguenti scenari:

    * Viene creata implicitamente una tabella temporanea per gestire una clausola GROUP BY o ORDER BY ed è presente una colonna VARCHAR nell'istruzione SELECT
    * Viene creata esplicitamente una tabella temporanea che contiene una colonna VARCHAR

    In questi casi la lunghezza della colonna VARCHAR viene presa in considerazione. La motivazione? Le tabelle temporanee in memoria non sono altro che tabelle dello storage engine MEMORY che, per qualche ragione, tratta tutte le colonne VARCHAR(X) come CHAR(X).

    Ciò comporta che se definite due campi, uno come VARCHAR(255) ed un altro come VARCHAR(128), il secondo consumerà  la metà  dello spazio quando viene allocato in una tabella temporanea. Più record possono entrare all'interno di max_heap_table_size, e meno sono le probabilità  di richiedere swapping su disco (cercate SHOW STATUS LIKE 'Created_tmp_disk_';), portando a migliori performance generali.

  7. Ci sono cali di performance quando si effettuano join fra tabelle di storage engine differenti?

    No. Eseguire una SELECT su storage engine multipli va bene. Si hanno risultati impredicibili quando si mescolano engine transazionali e non-transazionali all'interno di una transazione che modifica i dati.

  8. Se cambio una tabella derivata in una vista, le performance migliorano?

    No. Una vista è semplicemente una tabella derivata (almeno quando viene creata usando l'algoritmo TEMPTABLE). Ciò implica che non ci sono differenze di performance fra una normale tabella derivata e una vista. La vista rende semplicemente il codice più leggibile e meno "componentizzato".

  9. Se vedo "Using temporary; Using filesort" nella colonna Extra dell'output di un comando EXPLAIN, vuol dire che è stata creata una tabella temporanea su disco?

    No. Una tabella su disco viene creata solo nelle situazioni seguenti:

    * Quando la dimensione della tabella temporanea creata implicitamente (da un GROUP BY o ORDER BY su una colonna non indicizzata) è maggiore sia di tmp_table_size che di max_heap_table_size
    * Quando ci sono campi di tipo BLOB o TEXT nell'espressione SELECT
    * Quando avviene una scansione completa della tabella che eccede il valore della variabile read_buffer_size (configurata per thread della connessione)

    Questi sono gli scenari (che ho in testa) che possono causare la creazione di tabelle temporanee su disco. Ce ne potrebbero essere altri. In ogni caso la tabella temporanea creata su disco sarà  una tabella MyISAM.

  10. E' possibile effettuare una FULL OUTER JOIN in MySQL?

    Si. Si usino sia LEFT che RIGHT JOIN nella stessa condizione di join della query, in questo modo:

    SELECT *
    FROM A LEFT JOIN B ON A.id = B.id
    UNION ALL
    SELECT *
    FROM A RIGHT JOIN B ON A.id = B.id
    WHERE A.id IS NULL

13Jul/071

GoPHP5

GoPHP5 Logo

La versione 5 di PHP è stata rilasciata pubblicamente 3 anni fa, eppure, nonostante i grandissimi passi avanti rispetto alla versione precedente, ancora la sua diffusione è molto bassa.

Il problema del passaggio a PHP5 non è solo tecnico ma anche "politico", infatti moltissime applicazioni disponibili su Internet non sono compatibili con la nuova versione del linguaggio e i siti di hosting non vogliono rischiare di essere abbandonati dai propri utenti perchè i loro programmi non girano più.

Ci voleva quindi una iniziativa forte che "obbligasse" gli sviluppatori delle applicazioni PHP più diffuse a sforzarsi per renderle compatibili con PHP5, facilitando quindi la transizione ai provider.

Questa iniziativa adesso esiste e si chiama GoPHP5, e propone come scadenza per l'adozione di PHP 5.2.0 (o successivi) il 5 Febbraio 2008.
Hanno già  aderito in molti, ad esempio phpMyAdmin o Drupal.

Io personalmente non posso che essere felice di questo passaggio, da un paio di anni per le mie applicazioni uso solo PHP5, ma sviluppando software custom mi è molto più facile richiedere l'installazione dei pacchetti che mi servono.

E voi? Avete poco più di 200 giorni per adeguarvi...

Tagged as: , 1 Comment
27Jun/071

Angoli arrotondati per Google Adsense

Si tratta solo di un cambiamenti minore, ma è stata aggiunta una nuova feature che riguarda gli annunci pubblicitari di Google, comunemente noti come Google AdSense.

E' possibile ora arrotondare gli angoli degli annunci e ottenere un effetto come questo:


Per applicare questo effetto ai vostri annunci, vi basta aggiungere una riga con questo codice:
google_ui_features = "rc:X";dove X è un valore compreso fra 0 e 10 (in questo esempio X è 6), che indica quanto gli angoli dovranno essere arrotondati.

Ne potevamo sicuramente fare a meno, ma secondo me così si adattano meglio a temi come il mio.
Inoltre quella degli angoli arrotondati è una delle scelte che vanno per la maggiore nel web design moderno, no?

Tagged as: , 1 Comment
30May/075

Rilasciato Docebo 3.0.6

Nonostante sia uno degli sviluppatori ed in particolare sia stato il responsabile di questa versione, vi annuncio con ben due giorni di ritardo il rilascio di Docebo 3.0.6, che corregge una ventina di bug della versione precedente.

Per i dettagli sui cambiamenti ecco qui il changelog.

Il pacchetto completo è disponibile nell'area download del sito docebo.org, ed inoltre sono disponibili i manuali ed una serie di corsi gratuiti.

Non conoscete Docebo? Sicuramente adesso avete una buona scusa per provarlo, in ogni caso ecco qui la definizione migliore:

La suite Docebo è un progetto open source completamente gratuito che mette a disposizione una suite per l'e-learning e per la creazione di portali web.

La piattaforma di e-learning (LMS) supporta scorm 1.2 ed integra più di 50 funzioni, il sistema di CMS utilizza il sistema ad albero per creare pagine in modo veloce ed intuitivo. Il tutto è tradotto in 9 lingue.

20May/070

Di ritorno dal PHPDay

Ho dovuto puntare la sveglia alle 5 e andare dalla parte opposta del Paese per partecipare al PHPDay, ma ne è valsa sicuramente la pena.

L'evento è stato un grande successo, circa 200 partecipanti, sponsor del calibro di Microsoft, Zend, Yahoo, Codegear e php | architect, e speaker di alto livello, suddivisi in due canali: Developer ed Enterprise.

Tutti i talk del canale Developer sono anche stati filmati e trasmessi in streaming grazie a Ustream.tv, e molti di essi sono disponibili sul sito dell'evento insieme alle slide.

In particolare ci sono stati due talk strepitosi, quello di Jacopo Romei sull'Extreme Programming e quello di Gabriele Lana sul testing delle applicazioni web.

Buona l'idea di organizzare dei Lightning Talks durante le pause, peccato che il tempo fosse poco e comunque la gente ha bisogno di fare delle pause, soprattutto se è sveglia dalle 5 del mattino! :-)

Unica nota negativa della giornata il pranzo al ristorante convenzionato con l'evento, mi sa che la prossima volta bisognerà  trovare una soluzione migliore.

A parte questo, non può che renderci felici l'annuncio dell'intenzione di raddoppiare il PHPDay e organizzare un secondo evento prima della fine dell'anno, speriamo bene!

15May/070

PHPDay 2007

Venerdì 18 Maggio (fra 3 giorni) si terrà  a Verona il quarto PHPDay e io ho già  comprato il mio biglietto aereo per esserci.

L'iscrizione è gratuita, quindi se siete interessati e nelle vicinanze, vi consiglio di passare a dare un'occhiata.
Copio di seguito l'annuncio ufficiale, tratto dal sito www.phpday.it:

Il GrUSP (Gruppo Utenti e Sviluppatori PHP italiani) organizza per Venerdì 18 Maggio 2007 la quarta edizione del PHPDay, giornata interamente dedicata al linguaggio PHP. Saranno presentati argomenti inerenti l’uso di PHP in azienda (percorso Enterprise) e conferenze di taglio più tecnico (percorso Developer). Presenti, tra gli altri, relatori di Zend ed eZ Systems. Le ultime novità  e le modalità  per presentare un proprio argomento o sponsorizzare la manifestazione su www.phpday.it

Le conferenze saranno divise in due canali: Developers e Enterprise.
Per il calendario completo ecco il link.

Tagged as: , , , No Comments
26Apr/073

Sono su Amazon!

Scusate l'autocelebrazione, ma ho scoperto con un certo orgoglio di essere presente come autore su Amazon.

Non credo possa dare la stessa soddisfazione anche a voi, ma se volete unirvi a me ecco il link.

Tagged as: , , , 3 Comments
23Apr/075

Diventare ricchi con la pubblicità

Non ho mai pensato di guadagnare qualcosa con Adsense, il servizio di Google per la pubblicazione di annunci pubblicitari a pagamento, tuttavia ne sono sempre stato incuriosito e mi sono sempre chiesto se possa funzionare.

Ci sono casi eclatanti, ad esempio il sito ShoeMoney (che non avevo mai sentito nominare), che riesce a fatturare cifre dell'ordine di 4-5 mila dollari al giorno e non è nemmeno la cifra più alta che si legge in giro!

Ecco le statistiche relative agli annunci che vengono mostrati in queste pagine:

  • questo sito ha mostrato circa 1000 annunci al mese per 3 mesi
  • in totale sono stati effettuati ben 8 click, più o meno un click ogni 400 impressioni, in pratica lo 0,002%
  • il ricavo totale è pari a 2 dollari e 11 centesimi
  • in media quindi un click è stato valutato 25 centesimi di dollaro

Se queste percentuali sono più o meno uguali per tutti i siti, allora ShoeMoney deve ricevere circa 18.000 clic e mostrare qualcosa come 7 milioni di annunci pubblicitari al giorno!
Vi sembra possibile?

A me viene però un altro dubbio, cioè che la posizione ed il contenuto degli annunci influiscano moltissimo sulla percentuale di clic.
Ad esempio, se guardo adesso l'anteprima di questo post, vedo due annunci relativi a mutui e prestiti. Ok, possono interessare a tanta gente, ma su un blog che parla (più o meno!) di informatica, non mi sembrano proprio azzeccatissimi...

Ma quello che mi chiedo più spesso è: la gente clicca su questi annunci pubblicitari?

17Apr/070

Microsoft attacca Flash

Nonostante la diffusione quasi pervasiva di Flash (il 98% dei computer ha installato il Flash Player), Microsoft ha deciso di proporre un suo concorrente ed ha appena annunciato Silverlight.
Si tratta della tecnologia precedentemente nota come WPF/E (Windows Presentation Foundation Everywhere), ed è un linguaggio di markup basato su XML.

Le caratteristiche che dovrebbero spingere l'adozione di Silverlight sono:

  • supporto per filmati WMV, anche su MacOS
  • integrazione con HTML e Javascript, che consente di interagire con gli oggetti Silverlight tramite codice lato client
  • il codice può essere generato lato server, favorendo l'interazione con i database
  • veloce e leggero (almeno così dice Microsoft)

Da nessuna parte però si parla di supporto per Linux, e questo sarà  sicuramente un grosso handicap.
Inoltre non vedo nessun vantaggio reale a parte il supporto per WMV che possa spingere gli utenti ad abbandonare Flash in massa e adottare questa nuova tecnologia.

Microsoft riuscirà  nuovamente ad imporre un suo standard?

28Mar/0716

Il “mio” libro su AJAX

Nei mesi passati ho collaborato con un editore inglese specializzato in testi tecnici, Packt Publishing, per la traduzione e la cura dell'edizione italiana del libro "AJAX e PHP: Sviluppare applicazioni web dinamiche".

Oggi finalmente è stata messa online una pagina dedicata a questa edizione, http://www.packtpub.com/AJAX-e-PHP/book, e il libro dovrebbe essere acquistabile nei negozi o via Internet da Aprile.

Ovviamente sono di parte, ma ho scelto di occuparmi di questo testo perchè AJAX è sicuramente la tecnologia del momento e non esistono, a mio parere, libri in italiano che trattano l'argomento con lo stesso approccio di questo. Gli autori, infatti, hanno scelto di spiegare tutta la teoria che sta dietro AJAX partendo dagli esempi ed in maniera molto pratica.

Nei 10 capitoli che compongono il libro si parla quindi di validazione di form, autocompletamento, chat, grafici, feed RSS, drag-and-drop e molto altro.

E non dimenticatevi della migliore edizione italiana di un libro di informatica! :-)