MySQL v.5.1: nuove funzionalita'

La versione 5.1 di MySQL introduce importanti nuove funzionalita' nell'RDBMS Free piu' diffuso al mondo.
In questo documento sono riportati i principali nuovi elementi introdotti dalla versione 5.1 oltre a qualche altra notizia utile:

Molte nuove funzionalita' erano state introdotte nella versione precedente: MySQL 5.0! Un breve riassunto delle funzionalita' introdotte nel tempo si trova su Introduzione a MySQL.
Buona lettura!

Partitioning

Il partizionamento consente di memorizzare dati ed indici di una tabella su piu' file/dischi. MySQL supporta diversi tipi di partizionamento: RANGE, LIST, HASH e KEY. E' anche possibile utilizzare il subpartitioning; in questo caso ogni partizione deve avere lo stesso numero di sottopartizioni. Le partizioni possono essere avere nomi definiti al momento della creazione della tabella oppure prendono come default il nome p0, p1, p2, ... Un esempio?

CREATE TABLE factTable (id INT, name VARCHAR(50), eventDate DATE)
    PARTITION BY RANGE( YEAR(eventDate) ) (
        PARTITION p0 VALUES LESS THAN (2005),
        PARTITION p1 VALUES LESS THAN (2006),
        PARTITION p2 VALUES LESS THAN (2007),
        PARTITION p3 VALUES LESS THAN MAXVALUE);

Oltre a spezzare su piu' device fisici il contenuto di una tabella il partizionamento offre altri vantaggi. Le query che fanno riferimento solo ad una partizione possono essere eseguite con un accesso ai soli device che li ospitano.
Un limite e' dovuto al fatto che il partizionamento deve basarsi su un valore intero. In realta', utilizzando opportune funzioni di conversione (eg. YEAR(), TO_DAYS() per le date), e' possibile partizionare utilizzando colonne con qualsiasi tipo di dato mantenendo il vantaggio prestazionale del pruning (esecuzione della select su una sola partizione e non sull'intera tabella).

Le partizioni possono essere gestite in modo dinamico. L'esempio piu' comune e' quello dello svecchiamento dati: con una semplice operazione di DDL e' possibile cancellare la parte di dati non piu' necessaria:

ALTER TABLE factTable DROP PARTITION p0;

Per maggiori informazioni sul partizionamento in generale e sulla sua implementazione in MySQL e' possibile consultare il documento DIVIDE ET IMPERA !

Cluster

Lo storage engine NDB, che supporta il clustering dei dati in MySQL, e' stato arrichito di nuove funzionalita'.
L'Engine NDB mantiene i dati i memoria e scambia le variazioni tra i diversi Storage Engine. A partire dalla versione 5.1 i dati (per essere precisi il contenuto delle colonne che non fanno parte di indici) possono essere memorizzati su disco. I passi necessari sono diversi: creazione di un LOGFILE GROUP, aggiunta di un UNDOFILE, creazione di un TABLESPACE, aggiunta di un DATAFILE e, finalmente, creazione di una tabella con la clausola STORAGE DISK!
Con la versione 5.1 e' possibile utilizzare la replication con un master su NDB. Il target puo' essere un NDB ma anche utilizzare un altro engine.
Inoltre sono disponibili nuove funzioni di utilita', un miglior supporto per le connessioni SCI, ...

Scheduler

Le funzioni di scheduling sono una novita' per MySQL. Sono state introdotte in modo elegante come un nuovo tipo di oggetto EVENT che e' possibile gestire con i soliti comandi di DDL:

CREATE EVENT myevent
    ON SCHEDULE 
      EVERY 6 HOUR
    COMMENT 'KeOraE'
    DO select now();
L'esempio da' un'idea delle possibilita' presenti. In pratica vengono eseguiti statement SQL a fronte di una schedulazione (gestita con la definizione di un momento di partenza e/o degli intervalli). Naturalmente l'uso piu' comune e' quello di richiamare una Stored Procedure realizzata ad Hoc.
Lo scheduler non e' attivo per default e va attivato impostando la relativa variabile globale:
set global event_scheduler = 'ON';

Replication

La replication di MySQL e' molto utilizzata grazie alla sua semplicita' ed efficenza. La tecnica utilizzata e' basata sul logging degli statement SQL. Ogni statement SQL di modifica lanciato sul DB Master viene salvato su un log (il binary log), quindi trasmesso sugli Slave ed eseguito. Vi sono alcune situazioni in cui tuttavia questa tecnica presenta dei limiti (nell'utilizzo di trigger e stored procedures, con statement SQL che utilizzano valori random, con alcuni comandi quali LOAD_FILE(), SYSDATE, UDF, ...).
Dalla versione 5.1 (5.1.8 per essere precisi) e' possibile utilizzare tre differenti metodi per registrare sul binary log:

La modalita' di logging e' configurata nel file my.cnf ma puo' essere modificata dinamicamente a livello di server o di singola sessione.

Logging

Oltre al binary log, utilizzato per la replication, MySQL utilizza altri due log: general_log e slow_log.
Il General Query Log riporta tutte le istruzioni SQL (anche le SELECT) eseguite, ed e' molto utile per debugging e per la sicurezza.
Lo Slow Log riporta gli statement che hanno richiesto piu' di un tempo predefinito per essere eseguiti. E' naturalmente molto comodo per la verifica delle prestazioni ed il tuning.

E' ora possibile avere questi log non solo su file ma anche su tabella. L'opzione da utilizzare e' la --log-output che accetta valori FILE, TABLE e NONE (con ovvi significati). L'Engine di default utilizzato per le tabelle di logging e' il CSV: e' quindi facile importare i dati anche su uno spreadsheet!
Dalla versione 5.1.12 la gestione dei log e' dinamica e possono essere utilizzati i comandi:

SET GLOBAL general_log = 'OFF';
E' anche disponibile la variabile di sessione sql_log_off per l'abilitazione del logging sulla sessione corrente.
Si tratta di una funzionalita' apparentemente banale... ma i vantaggi per il DBA sono notevoli! In precedenza era necessario riavviare il server MySQL per attivare il logging, ora puo' essere fatto dinamicamente riuscendo cosi' ad intervenire velocemente e senza disservizi.

Varie ed eventuali

I paragrafi precedenti hanno presentato solo le principali novita' introdotte dalla versione 5.1. Ma vanno anche riportati:

Molte nuove funzionalita' erano state introdotte nella versione precedente: MySQL 5.0! Un breve riassunto delle funzionalita' introdotte nel tempo si trova su Introduzione a MySQL!
Dopo un anno di test (RC: Release Candidate), la versione 5.1 e' di recente (Novembre 2008) divenuta di produzione (GA: General Availability). Per la versione 5.5 sono previsti soprattutto miglioramenti dal punto di vista prestazionale (InnoDB).

La prossima tappa della Roadmap MySQL e' la versione 6.0 che introduce il nuovo Storage Engine Falcon assai ricco di funzionalita' (ACID, tablespaces, foreign keys, performance tables, ...). (NdE in realta' la roadmap e' un poco cambiata dopo l'acquisizione da parte di Sun prima e di Oracle poi)
Quindi a presto!


Testo: MySQL v.5.1: nuove funzionalita'
Data: 32 Ottobre 2007
Versione: 1.0.1 - 1 Aprile 2011
Autore: mail@meo.bogliolo.name