jeudi 20 août 2009

Partionnement Horizontal avec Mysql - Retour d'expérience

Le partionnement des tables sous Mysql prend tout son sens quand on a affaire à de gros volumes de données (plusieurs millions d'enregistrements par table).

Cela n'est pas très compliqué de mise ne œuvre mais demande un travail rigoureux d'analyse des données et surtout d'analyse des requêtes attaquant en sélection les tables concernées.

Ca peut nécessiter de revoir certaines requêtes pour optimiser cela est s'assurer que Mysql détermine dans qu'elle partition aller chercher les données (au lieu de toutes les parcourir ce qui serait plus long que sans partitionnement).

Je ne conseille néanmoins pas de mettre en œuvre dés la conception technique le partionnement, il est préférable, à mon avis de le faire après coup, quitte à devoir revoir pas mal de code plutôt que de le faire en amont et risquer de mal choisir comment le partionnement est fait.

Dans certains cas j'ai était amené à ajouter des champs calculés dans des tables de façon à pouvoir mettre en place un partionnement optimum utilisant ces champs.

Pour mettre en place le partionnement je me suis beaucoup appuyé sur un très bon article : http://krierjon.developpez.com/mysql/partitionnement/

Il est également nécessaire de bien lire la documentation Mysql (http://dev.mysql.com/doc/refman/5.1/en/partitioning.html) et en particulier de bien comprendre les restrictions qui s'appliquent lors de la mise en place du partitionnement (http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations.html).

Par mis les restrictions on peut citer :

  • Le non support des foreign key (si la table est en innodb ca va de soit) : Il faut donc supprimer les foreign key de la table concernée avant de pouvoir brancher le partionnement
  • Le fait que les champs sur lesquels est basé le partionnement doit faire partie de la clé primaire : On est donc amené à ajouter à la clé primaire existante des champs supplémentaires quitte à ce que la clé primaire physique ne soit du coup plus représentative de ce qui identifie un enregistrement de la table.
  • Les champs utilisés pour partitionner doivent être des entiers. Si vous avez eu la mauvaise idée d'utiliser une chaine comme identifiant ca devient contraignant.


Aucun commentaire: