Was ist besser / schneller? MySQL oder Dateisystem?


9

Stellen wir uns eine Website vor, die ein Verzeichnis von Personen ist. Für jede Person kann es ein Profilfoto und eine Biografie geben.

Ich gebe zu, meine SQL- Abfragen könnten besser sein, aber im Allgemeinen was wäre schneller und würde weniger Rechenleistung verbrauchen.

Um zu überprüfen, ob eine Datei vorhanden ist, öffnen Sie sie oder

Überprüfen Sie anhand von MySQL, ob eine Biografie vorhanden ist, und zeigen Sie sie an.

Ich bin mir ziemlich sicher, dass im obigen Fall das Dateisystem die MySQL-Datenbank raucht.

Was ist, wenn ich die Datenbank zu einer schreibgeschützten txt-Datei mache?

Was ist in diesem Fall schneller?

Gibt es einen bestimmten Punkt, an dem es besser ist, MySql zu verwenden, wenn die txt-Datei zu viele Datensätze enthält?


4
Nehmen wir an, Sie haben 100.000 Menschen in Ihrem Verzeichnis und möchten das BIOS derjenigen, die 1978 geboren wurden. Woher kommt Ihrer Meinung nach der Rauch? Öffnen von 100K-Dateien im Dateisystem oder einer einzelnen Abfrage in SQL?
Ypercubeᵀᴹ

1
@ypercube - Ich stimme Ihnen zu, aber im Falle eines Linux-Betriebssystems gibt es eine Grenze für geöffnete Dateien gleichzeitig mit jedem Prozessor.
Satish Pandey

Antworten:


17

Das Dateisystem ist nützlich, wenn Sie nach einer bestimmten Datei suchen, da Betriebssysteme eine Art Index verwalten. Der Inhalt einer txt-Datei wird jedoch nicht indiziert, was einer der Hauptvorteile einer Datenbank ist. Ein weiterer Grund ist das Verständnis des relationalen Modells, damit Daten nicht immer wieder wiederholt werden müssen. Ein anderer ist das Verstehen von Typen. Wenn Sie eine txt-Datei haben, müssen Sie Zahlen, Daten usw. analysieren.

Also - das Dateisystem funktioniert in einigen Fällen möglicherweise für Sie, aber sicherlich nicht für alle.


+1, auch Dateisysteme eignen sich nicht für die Teilsuche nach Dateinamen oder anderen Attributen. Wenn die Anzahl der Dateien so groß ist, kann es vorkommen, dass Sie Probleme haben, Dateien auf diese Weise zu finden. Es ist jedoch üblich, ein Dateisystem für Daten zu verwenden, die nicht transaktionaler Natur sind und auf die immer als eine Einheit zugegriffen wird, z. B. Dokumentanhänge und Bilddateien.
NoChance

12

Es hängt wirklich davon ab, was Sie tun. Im Allgemeinen ist die Geschwindigkeit, mit der Sie eine Datei zum Lesen öffnen können, besser als die Geschwindigkeit, mit der Sie eine Netzwerkverbindung herstellen können. Für sehr einfache Operationen ist das Dateisystem also definitiv schneller. Dateisysteme werden wahrscheinlich auch ein RDBMS für den rohen Lesedurchsatz übertreffen, da weniger Overhead entsteht. Wenn Sie darüber nachdenken, kann die Datenbank in Bezug auf den Rohdurchsatz niemals schneller sein als das Dateisystem, auf dem sie sich befindet.

Bei sehr komplexen Vorgängen ist das Dateisystem wahrscheinlich sehr langsam. Zum Beispiel:

Lesen Sie 10 Zeilen aus dieser 1-Milliarden-Zeilendatei und suchen Sie dann in dieser anderen Datei nach passenden Zeilen. Ich habe Mitleid mit dir, wenn du das tun musst. Ein guter Datenbankserver hat jedoch Strategien, um dies schnell und gut zu tun, damit Sie das Rad nicht neu erfinden.

Außerdem müssen Sie wirklich herausfinden, was Sie tun. Welche Daten speichern Sie? Wie wirst du es transformieren? Wenn es sich um 100.000 Bilddateien handelt, sieht Ihre Lösung ganz anders aus als wenn es sich um ein Verzeichnis für 100.000 Personen handelt. (LDAP vielleicht? Oder eine SQL-Datenbank? Hängt vielleicht davon ab, was Sie tun.) Der Schlüssel hier ist, die Tools auszuwählen, die Ihren Aktivitäten entsprechen und die Ihnen Raum geben, mehr Verwendungen hinzuzufügen, anstatt das, was für manche am schnellsten erscheint eher abstrakter Anwendungsfall. Datenbanken sind wunderbare Werkzeuge, aber auf eine solche Frage kann man keine gute Antwort bekommen.

Schließlich ist vorzeitige Optimierung die Wurzel allen Übels. Wählen Sie jetzt nützliche Werkzeuge und finden Sie den Rest später heraus.


Wenn Sie zwei virtuelle Instanzen haben, die über eine virtuelle Netzwerkkarte kommunizieren, oder eine Datenbank, die auf derselben Instanz wie der Anwendungsserver ausgeführt wird, können Sie bei ausreichendem Speicher sicherstellen , dass ein Datenbanklesevorgang schneller ist als ein fs-Lesevorgang Wenn Sie sich auf das Dateisystem verlassen, sind Sie dem Caching- / Seitenersetzungsalgorithmus des fs-Treibers ausgeliefert, während eine Datenbank Speichersegmente so reservieren kann, dass sie nie ausgelagert werden, sodass die Latenzanforderungen Ihrer App an erster Stelle stehen . Angenommen, Sie haben das Austauschen aktiviert.
Parthian Shot

Ihre letzte Zeile stärkt mich ... @Chris Travers
Biswadeep Sarkar

5

Das Dateisystem ist anfangs vielleicht schneller, aber ich bezweifle es. Mit zunehmender Datengröße müssen Sie jedoch wahrscheinlich Ihr Dateisystem umstrukturieren, um die Leistung aufrechtzuerhalten. Neben ihrer offensichtlichen Fähigkeit, mehrere Attribute zu indizieren, lassen sich Datenbanken tendenziell besser skalieren.

Web-Caches, die ähnlich funktionieren wie Sie, verwenden den Verzeichnisbaum, um die Leistung aufrechtzuerhalten. Sie haben auch eine relativ feste Größe, so dass sie sich nicht mit einer wachsenden Skala auseinandersetzen müssen.

Für diese Art von Anwendung würde ich mit einer Datenbank beginnen, da diese besser zu Ihren Anforderungen passt. Es wird auf lange Sicht viel besser skalieren. Im Vergleich zu den meisten Dateisystemen ist eine Datenbank auch platzsparender.


4
Das ist kein Problem. Erstellen wir einfach eine weitere Datei, in der Werte aufgelistet und Offsets gesucht werden. Tatsächlich könnten wir dies für die Suche mit Btrees optimieren. Dann wissen wir, wo wir die Datei lesen müssen! Als nächstes sollten wir unserem kleinen Programm eine deklarative Abfragesprache hinzufügen, die in der Lage ist, Ergebnisse zwischen verschiedenen begrenzten Dateien zusammenzuführen und dann möglicherweise die ACID-Konformität zu gewährleisten. Mit der Zeit, warum überhaupt ein RDBMS verwenden? ;-)
Chris Travers

@ChrisTravers War schon da, habe das gemacht und ich bin viel glücklicher mit einer Datenbank.
BillThor

5
Die Idee lautete: "Wer nicht von UNIX lernt, ist dazu bestimmt, es schlecht neu zu erfinden."
Chris Travers

1

Ich liebe es immer, in diese Foren zu kommen und all die schweren Datenbank-Gurus zu lesen, die das Dateisystem nicht so schnell wie die Datenbank ausführen kann. Im Gegenteil, ein richtig angelegter Baum, gut gestaltete Hashtabellen und das Speichern als Objekt in einer Datei ergeben die gleichen Geschwindigkeiten wie eine Datenbank und meine Tests. Eine richtig gestaltete Hashtabelle und ein Verzeichnisbaum gewinnen jedes Mal. Viel weniger Aufwand. Vor kurzem habe ich mich aus Gründen der Einfachheit und Programmportabilität von der datenbankgesteuerten Programmierung und mehr vom Dateibaum entfernt. Keine Datenbank bedeutet einfaches Backup. Zippen Sie einfach Ihren Baum und los geht's. Es ist sehr schön und eine Empfehlung, auf diese Weise für einmalige Kunden mit kleinen Anwendungen zu programmieren. Schauen Sie sich das große Bild an. Habe ich die Zeit, mein eigenes zu entwerfen oder einfach das zu nutzen, was bereits da ist, wie die Datenbank? Ich persönlich mag es, meine Objekte in einer Datei zu speichern und später zu verwenden. Behalten Sie einfach die Größe Ihrer Tabellen im Auge und prüfen Sie die Verwendung einer RandomAccessFile, um sie schnell wie eine Datenbank anlegen und in Hashtabellenobjekte aufteilen zu können . Genießen. Denken Sie daran, welche Daten, die Sie in der Datei speichern, je nach Code manchmal doppelt so viel Speicherplatz beanspruchen. Die Hash-Tabelle selbst und normalerweise der Ort, an dem Sie sie zum Anzeigen verwenden.


3
Die einzig angemessene Antwort darauf, die ich mir vorstellen kann, ist diese .
Mark Storey-Smith

3
@ MarkStorey-Smith, das ist ein interessanter Link, aber ist es vermessen, diese Lösung irgendwo im Dunning-Kruger-Spektrum zu implizieren? :)
David Mann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.