Magazine Internet

Article de fond: Réalisez votre propre index partitionné (T)

Publié le 08 juillet 2008 par Wtf

C'était un jour plutôt calme pour Levi.C. Sa société avait des équipes très compétentes, de bonnes méthodes de développement et des procédures de tests très sérieuses. Les appels au support technique étaient assez rares et à vrai dire, il commençait à s'ennuyer. Par chance, il eut le plaisir de recevoir un appel d'un de ses clients favoris.

"Salut Levi, si tu as du temps libre, pourrais-tu regarder pourquoi mon rapport tourne si lentement? C'est un système que on a fait faire par une autre société. C'est pas urgent mais si tu as deux minutes ...". Heureux de pouvoir sortir de sa monotonie, il rassembla toutes les informations possibles concernant le problème. Il essaya de lancer ce rapport sur le mois dernier, et effectivement c'était assez lent. Il lança le rapport pour les deux derniers mois et le système se planta.

Puisqu'il ne connaissait pas le système, il décida d'appeler l'un des développeurs qui avait participé au projet : "Ha oui, l'un de nos développeur a dû oublier d'initialiser la base de données quelques mois auparavant." Oublier d'initialiser la base de données? pensa Levi.

Levi vérifia la requête utilisée pour lancer un rapport. Il y avait plusieurs milliers de UNIONS qui combinaient HistoriqueClient_2007_05_75, HistoriqueClient_2007_05_74, HistoriqueClient_2007_05_73 et ainsi de suite. En rappelant le développeur, il comprit que les tables étaient nommées ainsi pour inclure une année, un mois et ... un identifiant client. Oublier d' "Initialiser la base de données" signifiait ne pas générer une table HistoriqueClient pour le mois et pour chaque identifiant client, ou d’oublier de mettre à jour les rapports qui requêtent les centaines de tables de la base. Non, la création de ces tables n'était pas automatique : il fallait le faire à la main.

Ainsi, les développeurs devaient absolument se rappeler de créer une nouvelle table par client à chaque début de mois. S'ils oubliaient, le système tout entier était paralysé. Quoi de pire? Et bien, leur système de base de données n'était configuré pour mettre en cache seulement la définition des 64 tables dernièrement utilisées - cris de douleur pour les centaines de tables utilisées régulièrement dans le système. Chaque nouvelle table créée avait le même schéma que les autres, incluant bien sur un champ identifiant auto incrémenté commençant toujours à 1. Ainsi, si vous voulez obtenir une ligne particulière d'une donnée client, il vous faudra connaître l'année, le mois, l'identifiant client et l'identifiant auto incrémenté de la ligne. Si une nouvelle colonne devait être ajoutée, des centaines de tables devraient être changées.

Pourquoi choisir une telle implémentation? Les développeurs ne connaissaient pas ou ne faisaient pas confiance à la capacité de MySql à gérer les partitions de données. En créant des centaines de tables, ils ont crée leur propre méthode de cluster de données. Quand à leur plan pour optimiser leur base de données, vous savez ce que l'on dit : "Visez la lune... et espérez de ne pas vous retrouver à l'exact opposé de ce que vous tentez d'accomplir."


Retour à La Une de Logo Paperblog

A propos de l’auteur


Wtf 169 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazine