lundi 4 janvier 2010

Nouvelles fonctionnalités dans le partitionnement de MySQL 5.5

Etant donné que cela fait un long moment que je n'ai pas bloggé je vais tenter de me rattrapper un peu :)

Je me suis penché sur l'une des nouvelles fonctionnalités de MySQL 5.5 concernant le partitionnement multi-colonnes en mode RANGE sur des types qui ne sont plus limités à l'entier.

En effet, il est possible de partitionner une table t1 sur 2 colonnes comme suit :

CREATE TABLE t1 (
valeur TINYINT UNSIGNED NOT NULL,
quand DATE NOT NULL,
libelle varchar(120)
)
PARTITION BY RANGE COLUMNS(valeur,quand) (
PARTITION p0 VALUES LESS THAN (10,'2006-10-02'),
PARTITION p1 VALUES LESS THAN (10,'2008-04-12'),
PARTITION p2 VALUES LESS THAN (100,MAXVALUE),
PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

Cependant l'algorithme qui répartit les données sur les différentes partitions créées n'est pas si intuitif que cela. Ainsi, j'imaginais dans un premier temps que l'enregistrement (100,'2005-10-02') ne pouvait se retrouver dans la partition p2 car 100 n'est pas inférieur à 100 ! En effet, je pensais que l'opérator LESS THAN sur un couple sous entendait que pour qu'un enregistrement (valeur,quand,libelle) appartienne à la partition p0 il fallait que valeur<10 et quand<'2006-10-02'.
Or ce n'est pas le cas, la preuve :

mysql> SELECT IF(10<10,'TRUE','FALSE'),IF('2005-10-02'<'2006-10-02','TRUE','FALSE'),IF((10,'2005-10-02')<(10,'2006-10-02'),'TRUE','FALSE')\G
*************************** 1. row ***************************
                              IF(10<10,'TRUE','FALSE'): FALSE
          IF('2005-10-02'<'2006-10-02','TRUE','FALSE'): TRUE
IF((10,'2005-10-02')<(10,'2006-10-02'),'TRUE','FALSE'): TRUE

Il faut dire qu'entre la documentation officielle qui a été corrigée (BUG 49875) suite à mon premier BUG 49861, et l'article de Giuseppe Maxia qui affirmait que si toutes les premières valeurs des listes de colonnes assignées aux partitions étaient différentes alors le partitionnement était identique au partitionnement sur cette seule colonne (corrigé depuis) j'ai un peu perdu la tête...

Cependant, cette histoire a bien fait de débuter puisqu'elle a débouché sur la correction de la documentation officielle, la correction d'un article avancé sur les nouveautés de la 5.5 concernant le partitionnement et sur la remise en cause des mots clés LESS THAN dans ce type de partitionnement avec une proposition de remplacement par NO GREATER THAN ou RANGE BOUNDED BY.

Nous verrons bien ce qu'il se passera dans les semaines à venir.