Inconvénients d'avoir (potentiellement) des milliers de répertoires sur un serveur au lieu d'une base de données?

StackOverflow https://stackoverflow.com/questions/1220965

Question

J'essaie de commencer à utiliser des fichiers texte brut pour stocker des données sur un serveur, plutôt que de les stocker tous dans une grande base de données MySQL. Le problème est que je générerais probablement des milliers de dossiers et des centaines de milliers de fichiers (si jamais je devais évoluer). Quels sont les problèmes avec cela? Est-ce que ça devient vraiment lent? Existe-t-il les mêmes performances que l’utilisation d’une base de données?

Ce que je veux dire: Au lieu d'avoir une base de données qui stocke une table de blog, vous avez une ligne contenant "auteur", "message". et " date " J'aurais plutôt: Un dossier pour la publication spécifique, puis les fichiers * .txt qui se trouvent dans ce dossier, et contenant les mots "author", "message", et " date " stockés en eux.

Était-ce utile?

La solution

La lecture serait extrêmement lente par rapport à une base de données (les écritures dans un fichier se produisent toutes à peu près à la même vitesse - vous ne pouvez pas stocker une écriture en mémoire).

Les bases de données sont optimisées et conçues pour gérer de telles quantités de données structurées . Les systèmes de fichiers ne sont pas. Ce serait une erreur d'essayer de répliquer une base de données avec un système de fichiers. Après tout, vous pouvez indexer les colonnes de votre base de données, mais il est difficile d'indexer le système de fichiers sans autre outil.

Les bases de données sont conçues pour un accès et une récupération rapides des données. Les systèmes de fichiers sont conçus pour le stockage de données. Utilisez le bon outil pour le travail. Dans ce cas, il s’agit bien d’une base de données.

Cela étant dit, si vous souhaitez créer des fichiers HTML pour les publications, puis les stocker dans une base de données afin de pouvoir y accéder facilement, c'est une bonne solution (à la Movable Type).

Mais si vous stockez ces éléments sur un système de fichiers, comment pouvez-vous connaître votre dernier message? Auteur le plus prolifique? Auteur le plus controversé? Toutes ces choses sont triviales avec une base de données et très difficiles avec un système de fichiers. Tenez-vous en à la base de données, vous ne le regretterez pas.

Autres conseils

Ça dépend vraiment:

  • Quelle est la taille du fichier
  • Quelles exigences de durabilité avez-vous?
  • Combien de mises à jour effectuez-vous?
  • Qu'est-ce que le système de fichiers?

Il n'est pas évident que MySQL soit plus rapide:

J'ai déjà effectué une telle comparaison pour un petit objet afin de l'utiliser comme stockage de sessions pour CppCMS . Avec un index (clé uniquement) et deux index (clé primaire et délai secondaire).

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

Comme vous pouvez le constater, avec le système de fichiers Ext3 simple, le système était plus rapide ou aussi rapide que Sqlite3 pour stocker les données car il ne vous donnait pas (D) d’ACID.

D’un autre côté ... DB vous offre de nombreuses fonctionnalités importantes dont vous avez probablement besoin. Je ne recommanderais pas d’utiliser des fichiers comme stockage sauf si vous en avez vraiment besoin.

N'oubliez pas que DB est pas toujours le goulot d'étranglement du système

Oubliez les réponses interminables, voici les raisons les plus simples pour lesquelles stocker des données dans des fichiers texte est une mauvaise idée:

  1. Il est presque impossible d'interroger. Comment trieriez-vous les articles de blog par date? Vous devez lire tous les fichiers et comparer leur date ou gérer votre propre fichier d’index (en d’autres termes, écrivez votre propre système de base de données.)

  2. C’est un cauchemar de sauvegarder. tar cjf ne le coupera pas. Si vous essayez, vous risquez de vous retrouver avec un instantané incohérent.

Il existe probablement une douzaine d'autres bonnes raisons de ne pas utiliser de fichiers, il est difficile de surveiller les performances, très difficile à déboguer, presque impossible à récupérer en cas d'erreur, il n'y a pas d'outils pour les gérer, etc.

Je pense que la clé ici est qu'il n'y aura PAS d'indexation sur vos données. Donc, pour récupérer quoi que ce soit, par exemple, une recherche serait extrêmement lente comparée à une base de données indexée. De plus, les opérations d'E / S sont coûteuses, une base de données pourrait être (partiellement) en mémoire, ce qui rend les données disponibles beaucoup plus rapidement.

Vous ne dites pas vraiment pourquoi vous n'utiliserez pas de base de données vous-même ... Mais dans le scénario que vous décrivez, j'utiliserais certainement un dossier de base de données tous les jours, pour plusieurs raisons. Tout d’abord, le scénario de blog semble très simple, mais il est très facile d’imaginer qu’un jour, vous voudriez le développer avec davantage de fonctionnalités telles que la recherche, plus de détails sur les publications, les catégories, etc.

.

Je pense qu'il serait plus difficile de développer le modèle dans une structure de dossiers que dans une base de données.

De plus, les bases de données sont généralement BEAUCOUP plus rapides que l'accès aux fichiers en raison de l'indexation et de la mise en cache de la mémoire.

IIRC Fudforum a utilisé le stockage de fichiers pour des raisons de rapidité. Il peut être beaucoup plus rapide de saisir un fichier que de rechercher un index de base de données, d'extraire les données de la base de données et de les envoyer à l'utilisateur. Vous négociez l'interface de système de fichiers avec les interfaces DB et DB-library.

Cependant, cela ne signifie pas que ce sera plus rapide ou plus lent. Je pense que vous constaterez que l'écriture est plus rapide sur le système de fichiers, mais que la lecture est plus rapide sur la base de données pour les problèmes généraux. Si, comme fudforum, vous souhaitez afficher plusieurs publications dans une seule donnée, une approche basée sur fichier peut être beaucoup plus rapide: par exemple, elles ne doivent pas rechercher toutes les publications associées, elles la collent toutes dans 1 fichier texte et l'afficher une fois. Si vous pouvez utiliser ce type d'optimisation, votre approche basée sur les fichiers fonctionnera.

De plus, les serveurs de messagerie fonctionnent également dans une approche basée sur les fichiers. Le format Maildir stocke chaque e-mail en tant que fichier dans un répertoire, pas dans une base de données.

Une chose que je dirais cependant, vous ferez mieux de tout stocker dans 1 fichier, pas 3. Le système de fichiers est meilleur pour lire (et mettre en cache) un seul fichier que pour plusieurs. Donc, si vous souhaitez stocker chaque message en 3 parties, enregistrez-les dans un seul fichier, lisez-le pour obtenir l'une des parties et affichez simplement celui que vous souhaitez afficher.

... et ensuite vous souhaitez rechercher tous les articles d'un auteur et lire un million de fichiers au lieu d'une simple requête SQL ...

Les bases de données ne sont PAS plus rapides. Pensez-y: à la fin, ils stockent également les données dans le système de fichiers. Donc, la question de savoir si une base de données est plus rapide dépend fortement du chemin d'accès.

Si vous avez un seul chemin d'accès, ce qui est en corrélation avec votre structure de fichiers, le système de fichiers peut être beaucoup plus rapide qu'une base de données. Assurez-vous simplement que vous avez du cache disponible pour le système de fichiers.

Bien sûr, vous perdez toutes les belles choses d'une base de données: - transactions - des méthodes flexibles pour indexer les données, et donc pour accéder aux données de manière flexible et assez rapidement. - langage de requête flexible (bien que laid) - grande capacité de récupération.

La mise à l'échelle dépend vraiment du système de fichiers utilisé. Autant que je sache, la plupart des systèmes de fichiers ont une sorte de limite supérieure pour le nombre de fichiers (total ou par répertoire), bien que sur les nouveaux, cela soit souvent très élevé. Pour que des centaines de milliers de fichiers avec une structure de répertoires conservent une taille raisonnable, il devrait être possible de trouver un système de fichiers performant.

@ Commentaire d'Eric: Cela dépend de ce dont vous avez besoin. Si vous n'avez besoin que du contenu exact de fichier sur chaque requête et que vous pouvez déterminer l'emplacement et le nom du fichier de manière déterministe, l'accès direct est plus rapide que celui d'une base de données, à savoir:

  • accéder à un tas d'entrées d'index, afin de
  • accéder à un ensemble de lignes de la table (rdbms lit généralement des blocs contenant plusieurs lignes), afin de
  • choisissez une seule ligne du bloc.

Si vous le regardez: vous avez des index et des lignes supplémentaires dans la mémoire, ce qui rend votre mise en cache inefficace, où est l'accélération d'une base de données supposée?

Les bases de données sont idéales pour le cas général. Mais si vous avez un cas particulier, il existe presque toujours une solution spéciale qui est meilleure dans un sens.

Si vous préférez vous passer du SGBDR, pourquoi ne pas essayer l'autre valeur de clé open source ou la base de données de document (Dbs non relationnelles) ..

De votre publication, je comprends que vous n’allez pas suivre les propriétés ACID de la base de données relationnelle .. il serait préférable d’adapter d’autres valeurs clés dbs (mongodb, coutchdb ou hyphertable) à la place de votre propre implémentation de système de fichiers .. donner de meilleures performances que les approches existantes.

Remarque: je ne suis pas un expert en la matière. Je viens de commencer à travailler sur MongoDB et je trouve que cela est utile dans des scénarios similaires. je voulais juste partager au cas où vous n'êtes pas au courant de ces approches

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top