AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Benchmarking (Objekte in DB vs. Objekte als Dateien)
Thema durchsuchen
Ansicht
Themen-Optionen

Benchmarking (Objekte in DB vs. Objekte als Dateien)

Ein Thema von Daniel · begonnen am 27. Apr 2010 · letzter Beitrag vom 28. Apr 2010
Antwort Antwort
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#1

Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:00
Datenbank: MySQL • Version: 5.x • Zugriff über: PHP-Schnittstellen
Moin,

der eine oder andere mag es wissen, dass ich mich mit einem Foren-Projekt befasse. In den einschlägigen Supportforen wird eine Frage immer wieder diskutiert: Legt man binäre Daten (in diesem Fall Attachments) lieber als Dateien im Dateisystem ab oder steckt man sie mit in die Datenbank.

Da gibt es einmal die, die sagen "Daten in die DB, Dateien ins Filesystem". Ich halte die Aussage für zu pauschal, da Anhänge und Bilder in diesem Zusammenhang sehr wohl Daten sind. Auf einem popeligen Shared-Webhosting mit 5.000+ Nutzern auf einem DB-Server und einer limitierten DB-Größe von maximal 30 MBytes würde ich ebenfalls davon abraten, dort noch Anhänge unterbringen zu wollen - logisch.

Bei Backups ist das Hantieren mit Verzeichnisstrukturen, die 30.000+ Dateien enthalten, auch nur bedingt spaßig. Da lasse ich lieber die DB kopieren, die dann halt um 7 GBytes groß ist. Die Verbindung zum Backup-Server ist schnell, das juckt mich eigentlich nicht.


Wie könnte ich jetzt zu sinnvollen Aussagen darüber kommen, welche Vorgehensweise mit der mir zu Verfügung stehenden Hardware und dem zu erwartenden Nutzeraufkommen die geeignetere ist? Was bedeutet es konkret für ein DBMS wie MySQL, wenn es Dateianhänge in der Größe von ein paar KBytes bis hin zu max. 5 Mbytes zu verwalten hat? Da niemand erwartet, dass alle Records gleichzeitig im Speicher liegen, würde ich es wagen, die These aufzustellen, dass ein aktuelles DMBS (selbst MySQL...) damit zurecht kommen MUSS. Wie kann ich also herausfinden, wie mein DBMS beeinflusst wird, wenn eine Tabelle existiert, die "wirklich groß" (30.000+ Records, 6 GBytes) ist?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:10
Du hast ja die wesentlichen Aspekte schon angesprochen. Beide Varianten haben Vorteile und Nachteile. Wobei hier auch die Wahl des DBMS (was ja durch MySQL schon vorgegeben ist) auch eine Rolle spielt.
Die Variante, in der die DB nur den Index enthält, dürfte bei MySQL etwas schneller sein ( andere DBMS wie Oracle oder FireBird kommen mit Blobs besse zurecht). Diese Version würde man auch wählen, wenn der Zugriff auf die Datein auch unabhängig von der DB Anwendung möglich sein soll.
Bei der anderen Variante ist der Backup bzw verschieben der Daten natürlich leichter
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:17
Wie wäre es mit einer Mischung?

Vorallem kleine und aktuelle Dateien in die DB
und die sehr großen, sowie Dateien, auf welche schon länger nicht mehr zugegriffen wurde ins Dateisystem auslagern.

So oder so ... im Dateisystem sollte besser nicht alles in ein und das selbe Verzeichnis, damit die jeweiligen Verzeichnisse nicht all zu umfangreich werden.


Bei meinem kleinen CMS plane ich es so, da die Dateien im Dateisystem sind, aber aktuelle Dateien mit in der DB-Cache landen.

Wenn du genug Speicher hast, dann könntest du die Dateien auch gleich noch mit fertig komprimiert vorhalten, falls z.B. der Browser (was die heutzutage ja meistens machen) eine komprimierte Datenübertragung zulassen.
> spart ein bissl Traffic
> und beim Verschicken RAM und CPU-Last, da sie dann direkt rausgeschickt werden könnten



PS: Wenn die Datei vom Dateisystem kommt, dann kann man den Dateiinhalt doch direkt Stück für Stück raussicken lassen (z.B. PHP bietet da ja nette Befehle dafür), wärend es von der DB erstmal (vermutlich in den RAM) geladen werden muß, bevor es rausgehn kann und solange bis es verschickt wurde.



Ein weiterer Vorteil an der DB-Variante wäre auch, daß hier die Dateien und die sonstigen Daten direkt verbunden wären, was für ein Backup doch wohl auch nicht schlecht ist. Also Alles am selben Ort.

Wärend die einzelnen Dateien erstmal wild im Dateisystem umliegen und somit physisch getrennt von den verlinkenden Foren-Beiträgen sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:26
Wenn man davon ausgeht das große Dateien die Datenbank langsamer machen würde ich auch eine Mischlösung bevorzugen. Wenn du Daten in der Datenbank speicherst hast du den Vorteil das du per Datenbankabfrage auch nach dem Inhalt von Dateien suchen kannst.
Den Punkt der Datensicherung würde ich vernachlässigen je nachdem wie der Zugang zum Server aussieht. Wenn man ein Script hat ist es eigentlich unerheblich ob es ein Verzeichnis sichert (wo die mysql-Daten liegen) oder ob es noch zusätzlich ein weiteres Verzeichnis ins Backup hinzufügt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:32
Die Dateien wären im Dateisystem qualitativ nicht schlechter aufgehoben. Das vBulletin strukturiert das ganz anständig und die Verbindung zu den jeweiligen Beiträgen lässt sich auch immer herstellen. Aber das ist nicht der Punkt...

Die Frage ist ja eben, OB die Datenbank langsamer wird.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:37
Bei einem DBMS, in dem die Blobs nicht getrennt von den restlichen Feldern gespeichert werden führt das zu einem Performanceverlust
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:38
Unseren Nutzern würden wir immer schreiben. "Probier es doch einfach aus".
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 27. Apr 2010, 22:49
Wie simuliert man da allerdings ein relativ hohe Nutzer-Aufkommen? Ich denke nicht, dass man das Verhalten sinnvoll nachstellen kann. Aber bei ausreichender Leistung (vor allem aber RAM) sollte es eigentlich kein Problem sein.

Wobei ich den Punkt der Sicherung schon als wichtig erachte, denn dann ist das Ganze etwas konsistenter imho.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

Re: Benchmarking (Objekte in DB vs. Objekte als Dateien)

  Alt 28. Apr 2010, 09:25
Also ich habe das mal so gemacht alle Daten in einer Extra Tabelle und die dann nur geladen wenn nötig.

Das gab keine Performance Probleme.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz