Jun/085
Stocker des fichiers dans MySQL
Est-il mauvais de stocker des fichiers dans MySQL ? Il n’y a pas de bonne ou mauvaise réponse à cette question. Tout dépend de vos besoins. Personnellement, je préfère stocker les fichiers à l’extérieur de la base de données pour les raisons suivantes:
- Le filesystem va mieux cacher les fichiers
- Le serveur MySQL va avoir plus de facilité à cacher les autres données
- Le débit de donnée du serveur va être moins élevé
- Il est plus facile de réorganiser et maintenir les fichiers
- Le tablespace demeure petit (si vous devez utiliser InnoDB)
Une bonne approche est de stocker un pointeur vers les fichiers sur le filesystem plutôt que le binaire du fichier directement dans la BD. Il y a cependant des avantages à les stocker dans la base de données:
- Toutes les données sont centralisées à une place pour les backups
- C’est plus simple à gérer avec la réplication et/ou du load balancing
- Il est possible de demeurer ACID compliant.
J’ai eu une situation qui aurait pu devenir très problématique dernièrement lorsque je devais faire la maintenance de la base de données de l’application RT. Pour faire une histoire courte, RT stock des attachements d’email dans une table InnoDB et le tablespace d’InnoDB est devenu corrompu lorsqu’il a atteint 40 Go. Lorsqu’on sélectionnait des enregistrements précis de la table Attachements, le serveur plantait et mysql_safe le repartait automatiquement. Heureusement, il s’agissait d’un Slave. Comme nous avions qu’un seul slave, nous avons du le “reconstruire” à partir du Master. 40Go de données, c’est long à backuper et restaurer et le downtime que ça a créé était considérablement long. Un downtime est toujours trop long. Sur les 40Go, environ 30 étaient des fichiers d’attachements. Ça aurait été beaucoup plus simple et rapide si les fichiers n’étaient pas stockés dans MySQL…
Enjoy this article?
Leave a comment
No trackbacks yet.
3:26 pm on December 26th, 2009
Bonjour,
je trouve que ton article est bien. Par contre moi je suis dans un cas où je dois peut être stocké des fichiers dans la base de données. En effet, je souhaite faire une recherche plein texte dans ces fichiers stockés. Ce sont des fichiers .pdf et .doc. S’il te plaît aurais tu une idée à me proposer ?
Merci d’avance.
Cordialement,
dialloma
9:44 pm on January 5th, 2010
@Dialloma. Les PDFs et les documents Word ne sont pas des fichiers “plain/text”. Pour MySQL, ce sont des fichiers binaires au même titre qu’un JPG. Il n’est donc pas capable de lire l’intérieur de ces fichiers ce qui rend la recherche impossible.
2:27 pm on January 19th, 2010
Pour ma part j’ai toujours eu une grande répugnance à stocker des données binaires dans la base.
Je trouve que ce n’est pas fait pour ça.
Le gestionnaire de fichiers est excellent pour … gérer des fichiers !
Le problème est d’éviter, à terme, les fichiers “morts”.
Je ne sais pas si il existe une solution qui permettrait de garder un lien fort entre le SGBD et les fichiers. Par exemple un système de régles basées sur le nommage qui permettraient les suppressions en cascade jusqu’aux fichiers ?!
2:08 pm on January 28th, 2010
@dialloma : pour la recherche full text, je te conseillerai plutôt de convertir tes fichiers au format texte (il doit y avoir des outils pour), de stocker ces textes dans ta BDD et d’utiliser Sphinx Search.
9:22 am on March 4th, 2010
J’ai une base de 11 Go, qui doit être utilisé par une centaine de personne en même temps, j’utilise mysql innodb,
quel serait le mieux pour ma configuration et le type de partitionnement des tables, index… pour avoir la meilleure performance possible, sachant que je ne suis pas limité au niveau de la taille de disque et de RAM;
Je vous remercie.